From 00a234eda81b4492f60d93ba961a36f08496ac97 Mon Sep 17 00:00:00 2001 From: rUv Date: Sat, 23 May 2026 15:34:48 -0400 Subject: [PATCH] ADR-110: ESP32-C6 firmware extension (#764) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes the firmware-side ADR-110 design at v0.7.0-esp32 after a 38-iter /loop SOTA sprint. Headline (bench, COM9+COM12 ESP32-C6): - 99.56% cross-board RX, 104.1 µs smoothed offset stdev (≤100 µs §2.4 target met) - 3.95× EMA suppression, 1.4 ppm crystal skew preserved 4 firmware releases: v0.6.7 / v0.6.8 / v0.6.9 / v0.7.0-esp32. 42 ADR-110 unit tests, 1761 v2 workspace tests, full Firmware CI + QEMU green. --- .github/workflows/firmware-ci.yml | 26 +- CHANGELOG.md | 17 + README.md | 19 +- archive/v1/src/hardware/csi_extractor.py | 148 +++- .../v1/tests/unit/test_esp32_binary_parser.py | 226 +++++- docs/ADR-110-BRANCH-STATE.md | 97 +++ docs/ADR-110-REVIEW-GUIDE.md | 62 ++ docs/WITNESS-LOG-110.md | 134 ++++ .../ADR-110-esp32-c6-firmware-extension.md | 211 ++++++ .../adr/ADR-115-home-assistant-integration.md | 670 ++++++++++++++++++ docs/adr/README.md | 1 + docs/user-guide.md | 234 +++++- firmware/esp32-csi-node/README.md | 6 +- firmware/esp32-csi-node/main/CMakeLists.txt | 27 + .../esp32-csi-node/main/Kconfig.projbuild | 145 ++++ firmware/esp32-csi-node/main/c6_lp_core.c | 196 +++++ firmware/esp32-csi-node/main/c6_lp_core.h | 77 ++ firmware/esp32-csi-node/main/c6_softap_he.c | 177 +++++ firmware/esp32-csi-node/main/c6_softap_he.h | 66 ++ firmware/esp32-csi-node/main/c6_sync_espnow.c | 239 +++++++ firmware/esp32-csi-node/main/c6_sync_espnow.h | 68 ++ firmware/esp32-csi-node/main/c6_timesync.c | 265 +++++++ firmware/esp32-csi-node/main/c6_timesync.h | 77 ++ firmware/esp32-csi-node/main/c6_twt.c | 155 ++++ firmware/esp32-csi-node/main/c6_twt.h | 75 ++ firmware/esp32-csi-node/main/csi_collector.c | 109 ++- .../main/lp_core/CMakeLists.txt | 9 + firmware/esp32-csi-node/main/lp_core/main.c | 75 ++ firmware/esp32-csi-node/main/main.c | 79 ++- firmware/esp32-csi-node/main/swarm_bridge.c | 11 +- .../release_bins/c6-adr110/SHA256SUMS.txt | 4 + .../release_bins/c6-adr110/bootloader.bin | Bin 0 -> 19568 bytes .../release_bins/c6-adr110/esp32-csi-node.bin | Bin 0 -> 1032512 bytes .../c6-adr110/ota_data_initial.bin | 1 + .../c6-adr110/partition-table.bin | Bin 0 -> 3072 bytes .../release_bins/s3-adr110/SHA256SUMS.txt | 3 + .../release_bins/s3-adr110/bootloader.bin | Bin 0 -> 18880 bytes .../release_bins/s3-adr110/esp32-csi-node.bin | Bin 0 -> 1110384 bytes .../s3-adr110/partition-table.bin | Bin 0 -> 3072 bytes .../s3-fair-adr110/SHA256SUMS.txt | 3 + .../s3-fair-adr110/bootloader.bin | Bin 0 -> 18880 bytes .../s3-fair-adr110/esp32-csi-node.bin | Bin 0 -> 886320 bytes .../s3-fair-adr110/partition-table.bin | Bin 0 -> 3072 bytes .../esp32-csi-node/sdkconfig.defaults.esp32c6 | 75 ++ .../esp32-csi-node/sdkconfig.defaults.s3-fair | 28 + firmware/esp32-csi-node/test/Makefile | 25 +- .../test/capture-3board-experiment.py | 129 ++++ .../esp32-csi-node/test/fuzz_csi_serialize.c | 15 + .../esp32-csi-node/test/stubs/esp_stubs.c | 10 + .../esp32-csi-node/test/stubs/esp_stubs.h | 28 +- .../test/test_adr110_encoding.c | 242 +++++++ firmware/esp32-csi-node/version.txt | 2 +- scripts/generate-witness-bundle.sh | 33 +- scripts/redact-secrets.py | 56 ++ v2/Cargo.lock | 1 + .../wifi-densepose-hardware/src/bridge.rs | 2 + .../wifi-densepose-hardware/src/csi_frame.rs | 94 +++ .../src/esp32_parser.rs | 113 ++- v2/crates/wifi-densepose-hardware/src/lib.rs | 4 + .../src/sync_packet.rs | 471 ++++++++++++ .../wifi-densepose-sensing-server/Cargo.toml | 23 + .../wifi-densepose-sensing-server/src/cli.rs | 212 ++++++ .../wifi-densepose-sensing-server/src/main.rs | 652 ++++++++++++++++- 63 files changed, 5864 insertions(+), 63 deletions(-) create mode 100644 docs/ADR-110-BRANCH-STATE.md create mode 100644 docs/ADR-110-REVIEW-GUIDE.md create mode 100644 docs/WITNESS-LOG-110.md create mode 100644 docs/adr/ADR-110-esp32-c6-firmware-extension.md create mode 100644 docs/adr/ADR-115-home-assistant-integration.md create mode 100644 firmware/esp32-csi-node/main/c6_lp_core.c create mode 100644 firmware/esp32-csi-node/main/c6_lp_core.h create mode 100644 firmware/esp32-csi-node/main/c6_softap_he.c create mode 100644 firmware/esp32-csi-node/main/c6_softap_he.h create mode 100644 firmware/esp32-csi-node/main/c6_sync_espnow.c create mode 100644 firmware/esp32-csi-node/main/c6_sync_espnow.h create mode 100644 firmware/esp32-csi-node/main/c6_timesync.c create mode 100644 firmware/esp32-csi-node/main/c6_timesync.h create mode 100644 firmware/esp32-csi-node/main/c6_twt.c create mode 100644 firmware/esp32-csi-node/main/c6_twt.h create mode 100644 firmware/esp32-csi-node/main/lp_core/CMakeLists.txt create mode 100644 firmware/esp32-csi-node/main/lp_core/main.c create mode 100644 firmware/esp32-csi-node/release_bins/c6-adr110/SHA256SUMS.txt create mode 100644 firmware/esp32-csi-node/release_bins/c6-adr110/bootloader.bin create mode 100644 firmware/esp32-csi-node/release_bins/c6-adr110/esp32-csi-node.bin create mode 100644 firmware/esp32-csi-node/release_bins/c6-adr110/ota_data_initial.bin create mode 100644 firmware/esp32-csi-node/release_bins/c6-adr110/partition-table.bin create mode 100644 firmware/esp32-csi-node/release_bins/s3-adr110/SHA256SUMS.txt create mode 100644 firmware/esp32-csi-node/release_bins/s3-adr110/bootloader.bin create mode 100644 firmware/esp32-csi-node/release_bins/s3-adr110/esp32-csi-node.bin create mode 100644 firmware/esp32-csi-node/release_bins/s3-adr110/partition-table.bin create mode 100644 firmware/esp32-csi-node/release_bins/s3-fair-adr110/SHA256SUMS.txt create mode 100644 firmware/esp32-csi-node/release_bins/s3-fair-adr110/bootloader.bin create mode 100644 firmware/esp32-csi-node/release_bins/s3-fair-adr110/esp32-csi-node.bin create mode 100644 firmware/esp32-csi-node/release_bins/s3-fair-adr110/partition-table.bin create mode 100644 firmware/esp32-csi-node/sdkconfig.defaults.esp32c6 create mode 100644 firmware/esp32-csi-node/sdkconfig.defaults.s3-fair create mode 100644 firmware/esp32-csi-node/test/capture-3board-experiment.py create mode 100644 firmware/esp32-csi-node/test/test_adr110_encoding.c create mode 100644 scripts/redact-secrets.py create mode 100644 v2/crates/wifi-densepose-hardware/src/sync_packet.rs diff --git a/.github/workflows/firmware-ci.yml b/.github/workflows/firmware-ci.yml index 55e0e186..16ece4fb 100644 --- a/.github/workflows/firmware-ci.yml +++ b/.github/workflows/firmware-ci.yml @@ -38,7 +38,7 @@ jobs: echo "version.txt matches the release tag." build: - name: Build ESP32-S3 Firmware (${{ matrix.variant }}) + name: Build firmware (${{ matrix.target }} / ${{ matrix.variant }}) runs-on: ubuntu-latest container: image: espressif/idf:v5.4 @@ -47,17 +47,27 @@ jobs: matrix: include: - variant: 8mb + target: esp32s3 sdkconfig: sdkconfig.defaults partition_table_name: partitions_display.csv size_limit_kb: 1100 artifact_app: esp32-csi-node.bin artifact_pt: partition-table.bin - variant: 4mb + target: esp32s3 sdkconfig: sdkconfig.defaults.4mb partition_table_name: partitions_4mb.csv size_limit_kb: 1100 artifact_app: esp32-csi-node-4mb.bin artifact_pt: partition-table-4mb.bin + # ADR-110: ESP32-C6 research target (Wi-Fi 6 / 802.15.4 / TWT / LP-core) + - variant: c6-4mb + target: esp32c6 + sdkconfig: sdkconfig.defaults + partition_table_name: partitions_4mb.csv + size_limit_kb: 1100 + artifact_app: esp32-csi-node-c6.bin + artifact_pt: partition-table-c6.bin steps: - uses: actions/checkout@v4 @@ -66,12 +76,22 @@ jobs: working-directory: firmware/esp32-csi-node run: | . $IDF_PATH/export.sh - if [ "${{ matrix.variant }}" != "8mb" ]; then + # 4mb variant supplies its own sdkconfig.defaults overlay. + # c6-4mb variant relies on the auto-applied sdkconfig.defaults.esp32c6 + # overlay (ESP-IDF auto-loads sdkconfig.defaults.$TARGET when present). + if [ "${{ matrix.variant }}" = "4mb" ]; then cp "${{ matrix.sdkconfig }}" sdkconfig.defaults fi - idf.py set-target esp32s3 + idf.py set-target ${{ matrix.target }} idf.py build + - name: Build and run host-side ADR-110 unit tests + if: matrix.variant == 'c6-4mb' + working-directory: firmware/esp32-csi-node/test + run: | + make test_adr110 + ./test_adr110 + - name: Verify binary size (< ${{ matrix.size_limit_kb }} KB gate) working-directory: firmware/esp32-csi-node run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 20d3a897..e0975bb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 they can be reintroduced with a real implementation. ### Added +- **ESP32-C6 firmware target with Wi-Fi 6 / 802.15.4 / TWT / LP-core support ([ADR-110](docs/adr/ADR-110-esp32-c6-firmware-extension.md), #762).** `firmware/esp32-csi-node` now builds for **both** `esp32s3` (existing production node) and `esp32c6` (new research/seed-node target) from the same source tree — pick via `idf.py set-target esp32c6` and ESP-IDF auto-applies the new `sdkconfig.defaults.esp32c6` overlay. Every C6 module is `#ifdef CONFIG_IDF_TARGET_ESP32C6` gated, so the S3 build is byte-identical to today (no regression). + - **Wi-Fi 6 HE-LTF subcarrier tagging** — `csi_collector.c` now reads `rx_ctrl.cur_bb_format` and writes the PPDU type (0=HT/legacy, 1=HE-SU, 2=HE-MU, 3=HE-TB) into ADR-018 frame byte 18, plus bandwidth flags (20/40 MHz, STBC, 802.15.4-sync-valid) into byte 19. Bytes 18-19 were previously reserved-zero, so old aggregators read them as before — fully backwards compatible. Magic stays `0xC5110001`. Default on via `CONFIG_CSI_FRAME_HE_TAGGING`. First firmware in the open ESP32 ecosystem to tag CSI frames with 11ax PPDU metadata. + - **802.15.4 mesh time-sync** — new `c6_timesync.{h,c}` (262 lines) provides cross-node clock alignment over the C6's separate 802.15.4 radio, freeing WiFi airtime from coordination traffic (directly addresses the ADR-029/030 multistatic synchronization gap). Protocol: lowest EUI-64 wins election, leader broadcasts `TS_BEACON` (`magic=0x54534D45`, leader epoch µs) every 100 ms on channel 15, followers compute `offset = leader_us - local_us` and apply lazily — every CSI frame is stamped with `c6_timesync_get_epoch_us()`. Target alignment ±100 µs. Default on via `CONFIG_C6_TIMESYNC_ENABLE`. Verified initializing at boot on COM6 (`c6_ts: init done: channel=15 EUI=206ef1fffefffe17 leader=yes(candidate)` at +413 ms). + - **TWT (Target Wake Time)** — new `c6_twt.{h,c}` (223 lines) wraps `esp_wifi_sta_itwt_setup` from `esp_wifi_he.h` to negotiate an individual TWT agreement with the AP after STA connect. Replaces today's opportunistic CSI capture with a scheduler-bounded one (default wake interval 10 ms = 100 fps cadence). Graceful NACK fallback: when the AP doesn't support 11ax iTWT, the helper logs and returns OK so the device keeps doing opportunistic CSI just like the S3. Teardown on `WIFI_EVENT_STA_DISCONNECTED` keeps the AP's TWT scheduler clean. Gated on `SOC_WIFI_HE_SUPPORT` (auto-set on C6/C5 chips). + - **LP-core wake-on-motion hibernation** — new `c6_lp_core.{h,c}` (134 lines) arms the C6 LP RISC-V coprocessor as an always-on motion gate; HP core stays in deep sleep until a configurable GPIO wakes it (ext1 deep-sleep wake source in this initial cut, real LP-core program in follow-up). Targets ≤5 µA hibernation current for battery-powered Cognitum Seed nodes (vs the S3's ~10 µA ULP-FSM floor). Opt-in via `CONFIG_C6_LP_CORE_ENABLE` (default off — only enabled on nodes flashed for battery-powered seed duty). + - **Build matrix**: S3 stays `partitions_display.csv` (8 MB + display + WASM), C6 uses `partitions_4mb.csv` (4 MB single OTA, no display, no WASM3, no LCD). C6 final binary 1003 KB (46% partition slack), 9 % smaller than S3 production. Free heap 310 KiB at boot, app_main reached in 343 ms, 802.15.4 stack up in another 70 ms. + - **Why this matters**: opens three research surfaces nobody has published yet — Wi-Fi-6 CSI human pose, multistatic CSI clock alignment over a side-channel radio, and TWT-bounded deterministic CSI cadence. The S3 production fleet keeps shipping the existing capabilities; the C6 is the research / battery-seed expansion target. + - **Docs**: ADR-110 (186 lines, Status=Accepted), tracking issue [ruvnet/RuView#762](https://github.com/ruvnet/RuView/issues/762) with per-phase progress comments, README hardware table + Quick-Start Option 2b, `docs/user-guide.md` full ESP32-C6 section (build, flash, provision, multi-room time-sync, battery seed mode), full empirical record in [`docs/WITNESS-LOG-110.md`](docs/WITNESS-LOG-110.md) with verified / claimed / bugs-fixed / bugs-found sections. + - **Wave 2 follow-up (D1 workaround)**: 5 systematic experiments on 3 live C6 boards confirmed the IDF v5.4 802.15.4 RX path is unfixable from user code (TX works 100 %, RX delivers 0 frames; coex/channel/OpenThread/manual-rearm all ruled out). Pivoted to ESP-NOW for the cross-node sync transport — `main/c6_sync_espnow.{h,c}` is the same TS_BEACON protocol over WiFi peer-to-peer, same `get_epoch_us / is_valid / is_leader` API surface. **120 s single-board soak: 1151 transmits, 0 failures (0.00 %), 9.6 tx/s sustained, no crash or reset.** The 802.15.4 path stays in source as documented-broken (D1) for when the IDF driver gets fixed. + - **Host-side dual-pipeline decoder for ADR-018 byte 18-19** (ADR-110 protocol closure): + - **Rust** (`v2/crates/wifi-densepose-hardware`): new `PpduType` enum (HtLegacy/HeSu/HeMu/HeTb/Unknown) and `Adr018Flags` struct (bw40/stbc/ldpc/ieee802154_sync_valid) on `CsiMetadata`. 6 new deterministic unit tests; **122/122 hardware-crate tests pass**. + - **Python** (`archive/v1/src/hardware/csi_extractor.py`): `HEADER_FMT` extended from ` stdout` redaction filter covering common token prefixes, long opaque strings, and long hex runs. Verified zero leaks on rebuild. + - **Wave 3 — firmware v0.6.7 (LP-core full + soft-AP HE)**: two software-only unblocks for the hardware-blocked items in WITNESS-LOG-110 §B. (1) **Real LP-core motion-gate program** (`firmware/esp32-csi-node/main/lp_core/main.c` + integration in `c6_lp_core.c`). When `CONFIG_C6_LP_CORE_ENABLE=y`, the LP RISC-V coprocessor now runs a real polling program (configurable cadence via `CONFIG_C6_LP_POLL_PERIOD_US`, default 10 ms) that debounces N consecutive GPIO samples (`CONFIG_C6_LP_DEBOUNCE_SAMPLES`, default 3) and wakes the HP core via `ulp_lp_core_wakeup_main_processor()`. HP entry uses `esp_sleep_enable_ulp_wakeup` + `ESP_SLEEP_WAKEUP_ULP`. Exposes `c6_lp_core_motion_count()` and `c6_lp_core_poll_count()` getters for the witness harness. **Replaces** the v0.6.6 `esp_deep_sleep_enable_gpio_wakeup` ext1 fallback (which floored at ~10 µA, the same as the S3 ULP-FSM). The fallback path stays as the `else` branch so builds without `CONFIG_C6_LP_CORE_ENABLE` keep working unchanged — zero regression for v0.6.6-era fleets. Targets the C6 datasheet ≤5 µA average for battery seed nodes; pending INA/Joulescope measurement to confirm (`WITNESS-LOG-110 §B4`). (2) **Wi-Fi 6 soft-AP with TWT Responder=1** (`c6_softap_he.{h,c}` + `main.c` AP+STA mode switch). When `CONFIG_C6_SOFTAP_HE_ENABLE=y`, one C6 board can act as the iTWT-capable AP the bench is otherwise missing — pair with a second C6-STA board to negotiate real iTWT against a known-cooperative AP and measure deterministic CSI cadence (`WITNESS-LOG-110 §B1/B2`). SSID/PSK/channel configurable via Kconfig defaults or NVS (`softap_ssid`/`softap_psk`/`softap_chan` keys in the `ruview` namespace). Default off so existing nodes are unaffected. **Build artifacts**: S3 8 MB binary 1093 KB (47 % slack), C6 4 MB binary 1019 KB (45 % slack). Tag: `v0.6.7-esp32`. + - **Wave 4 — firmware v0.6.8 (ESP-NOW mesh offset smoother)**: `c6_sync_espnow.c` now maintains an in-firmware exponential-moving-average of the cross-board sync offset (α = 1/8, fixed-point shift, ≈ 8-sample window at the 10 Hz beacon rate). New getter `c6_sync_espnow_get_offset_us_smoothed()`. `c6_sync_espnow_get_epoch_us()` now returns timestamps stamped from the smoothed offset once seeded — every downstream CSI-frame consumer gets bounded-jitter alignment for free, no host-side filter required. **Measured on the bench**: 5-min two-board soak (WITNESS-LOG-110 §A0.10) drops raw offset stdev 411.5 µs → smoothed 104.1 µs (**3.95× suppression** on stdev, 4.70× on peak-to-peak range) while preserving the +30 µs/min crystal-drift trajectory within 2 µs/min. **The ADR-110 §2.4 ≤100 µs multistatic alignment target that v0.6.6 designed is now empirically measured, not just stated.** Cross-board beacon match rate 99.56% over 5 min, 0 TX failures. Binary cost: +32 bytes (one int64, one bool, one getter). Diag log adds `smoothed=…` field. Tag: `v0.6.8-esp32`. **Known wiring gap (deferred)**: `csi_serialize_frame` does not yet stamp frames with `c6_sync_espnow_get_epoch_us()` — the ADR-018 frame format has no timestamp field, and adding one is a breaking change that needs an ADR update. Multistatic CSI fusion will require either an ADR-018 v2 with timestamp, or a separate UDP sync packet keyed off the existing flag bit. Tracked in WITNESS-LOG-110 §A0.11. + - **Wave 5 — firmware v0.6.9 + v0.7.0 + host wiring (loop iter 8 → iter 26)**: closes the §A0.11 gap and lights up the substrate end-to-end across firmware → host → JSON broadcast. **Firmware**: (a) **v0.6.9-esp32** — `csi_collector.c` emits a 32-byte UDP sync packet (magic `0xC511A110`, distinct from CSI frame magic `0xC5110001`) every `CONFIG_C6_SYNC_EVERY_N_FRAMES` (default 20) CSI frames, carrying `node_id`, `local_us`, mesh-aligned `epoch_us` (from the Wave 4 smoothed offset), and the CSI sequence high-water for host-side pairing. Same UDP socket as CSI; host dispatches by leading magic. Operator-tunable cadence via the new Kconfig knob — N=1 (10 Hz) for tight multistatic, N=200 (~20 s) for low-power seeds. Live-verified on COM9+COM12 (§A0.12): follower reports `local − epoch = 1 163 565 µs`, matches the §A0.10 boot-delta measurement within 285 µs of WiFi MAC TX jitter. (b) **v0.7.0-esp32** — `csi_collector.c:221` ADR-018 byte 19 bit 4 ("cross-node sync valid") now ORs in `c6_sync_espnow_is_valid()` so frames from sync'd ESP-NOW nodes correctly advertise sync (previously only sourced from the broken 802.15.4 path — false-negative bug, §A0.13). Side effect: S3 boards now also set the bit since `c6_sync_espnow` is cross-target. **Host decoders + 25 unit tests**: Python `SyncPacketParser` + `SyncPacket` dataclass with `apply_to_local` / `mesh_aligned_us_for_sequence` / `local_minus_epoch_us` (10 tests in `TestSyncPacketParser`); Rust `wifi_densepose_hardware::SyncPacket` + `SyncPacketFlags` + `SYNC_PACKET_MAGIC` re-exported from the crate root with identical API surface (15 tests in `sync_packet::tests`). **Cross-language conformance gate** (loop iter 21): the same 32-byte canonical hex `10a111c509010600f26db70100000000c5aca501000000001400000000000000` is pinned in both test suites; if either decoder drifts from the wire, exactly one named test fires and points at the moved side. **Sensing-server wiring**: `udp_receiver_task` magic-dispatches `0xC511A110` and stores per-node `latest_sync: Option` + `latest_sync_at: Option` on `NodeState`. New helpers: `NodeState::mesh_aligned_us(local_us)`, `NodeState::mesh_aligned_us_for_csi_frame(sequence)` (uses the per-node measured fps EMA with 5-sample warmup + 9 s staleness gate), `NodeState::observe_csi_frame_arrival(now)` (feeds `update_csi_fps_ema` α=1/8, called once per accepted CSI frame). 4 fps-EMA tests + 3 NodeSyncSnapshot serialization tests on the binary target. **Public JSON API**: `sensing_update` broadcasts now carry an optional `sync` object per node — `{offset_us, is_leader, is_valid, smoothed, sequence, csi_fps_ema, csi_fps_samples}` — `#[serde(skip_serializing_if = "Option::is_none")]` so non-mesh paths (multi-BSSID scan / synthetic-RSSI fallback / simulation) omit the key entirely. Existing pre-v0.7.0 UI clients ignore it cleanly. Documented in `docs/user-guide.md` "Per-node mesh sync (ADR-110)" section with field table, UI rendering rules, and the timestamp-recovery recipe. **Branch-coordination**: `docs/ADR-110-BRANCH-STATE.md` maps which files each of `adr-110-esp32c6` vs `feat/adr-115-ha-mqtt-matter` touches (regions are disjoint, merges should be clean line-merges). **Verification baselines**: full v2 cargo workspace at **1437 tests passing** (no regression across 17 crate batches), full `wifi-densepose-hardware` crate at **137 tests**. ADR-110 §B substrate is now end-to-end visible to UI clients and ready for ADR-029/030 multistatic CSI fusion consumption. - **Real-time CSI introspection / low-latency tap on `wifi-densepose-sensing-server` (ADR-099).** New `wifi_densepose_sensing_server::introspection` module wires [midstream](https://github.com/ruvnet/midstream)'s `temporal-attractor` (Lyapunov + diff --git a/README.md b/README.md index d15a71f4..c5f7fe1e 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ docker pull ruvnet/wifi-densepose:latest docker run -p 3000:3000 ruvnet/wifi-densepose:latest # Open http://localhost:3000 -# Option 2: Live sensing with ESP32-S3 hardware ($9) +# Option 2a: Live sensing with ESP32-S3 hardware ($9) # Flash firmware, provision WiFi, and start sensing: python -m esptool --chip esp32s3 --port COM9 --baud 460800 \ write_flash 0x0 bootloader.bin 0x8000 partition-table.bin \ @@ -88,6 +88,20 @@ python -m esptool --chip esp32s3 --port COM9 --baud 460800 \ python firmware/esp32-csi-node/provision.py --port COM9 \ --ssid "YourWiFi" --password "secret" --target-ip 192.168.1.20 +# Option 2b: WiFi 6 + 802.15.4 research sensing with ESP32-C6 ($6-10, ADR-110) +# Same csi-node firmware compiled for the C6 target — picks up the C6 +# overlay (sdkconfig.defaults.esp32c6) automatically. +cd firmware/esp32-csi-node +idf.py set-target esp32c6 && idf.py build +idf.py -p COM6 flash +# C6 boot extras (vs S3): HE-LTF subcarrier tagging in ADR-018 bytes 18-19, +# 802.15.4 mesh time-sync on channel 15, TWT setup when the AP supports it, +# opt-in LP-core wake-on-motion for ~5 µA battery seed nodes. +# v0.6.7 adds: real LP-core RISC-V motion-gate program (debounce + motion +# counter) and a Wi-Fi 6 soft-AP with TWT Responder so two C6 boards can +# benchmark real iTWT without buying an 11ax router. Both default off, +# flip CONFIG_C6_{LP_CORE,SOFTAP_HE}_ENABLE to turn them on. + # Option 3: Full system with Cognitum Seed ($140) # ESP32 streams CSI → bridge forwards to Seed for persistent storage + kNN + witness chain node scripts/rf-scan.js --port 5006 # Live RF room scan @@ -103,7 +117,8 @@ node scripts/mincut-person-counter.js --port 5006 # Correct person counting > | Option | Hardware | Cost | Full CSI | Capabilities | > |--------|----------|------|----------|-------------| > | **ESP32 + Cognitum Seed** (recommended) | ESP32-S3 + [Cognitum Seed](https://cognitum.one) | ~$140 | Yes | Presence, motion, breathing, heart rate, fall detection, multi-person counting, 17-keypoint pose (signed Cog binary), 105-cog catalog, persistent vector store, kNN search, witness chain, MCP proxy | -> | **ESP32 Mesh** | 3-6x ESP32-S3 + WiFi router | ~$54 | Yes | Same capabilities as above without the persistent-memory features | +> | **ESP32 Mesh** | 3-6× ESP32-S3 + WiFi router | ~$54 | Yes | Same capabilities as above without the persistent-memory features | +> | **ESP32-C6 research node** ([ADR-110](docs/adr/ADR-110-esp32-c6-firmware-extension.md), [witness](docs/WITNESS-LOG-110.md), [reviewer guide](docs/ADR-110-REVIEW-GUIDE.md), [firmware v0.7.0](https://github.com/ruvnet/RuView/releases/tag/v0.7.0-esp32)) | ESP32-C6-DevKit ($6–10) | ~$10 | Yes (Wi-Fi 6 capable) | Same CSI pipeline as S3 with the dual-target firmware. **Firmware-side ADR-110 substrate now closed** (v0.7.0): ESP-NOW cross-board mesh quantified at **99.56 % match / 104 µs smoothed offset stdev / 3.95× EMA suppression** over a 5-min two-board soak (witness §A0.10), 32-byte UDP sync packet with operator-tunable cadence (§A0.12), ADR-018 byte 19 bit 4 wire-fix sourced from the working ESP-NOW path (§A0.13). Wire format ready for HE-LTF PPDU tagging in ADR-018 bytes 18-19 (firmware encoder + Rust + Python decoders verified end-to-end across 23 unit tests). LP-core motion-gate RISC-V program and Wi-Fi 6 soft-AP with TWT Responder both ship as opt-in code paths (default off). **Hardware-gated for measurement**: HE-LTF live subcarrier capture needs an 11ax AP (IDF v5.4 doesn't expose AP-side HE config — §A0.6); ~5 µA LP-core hibernation needs an INA meter to capture; 802.15.4 raw RX is broken in IDF v5.4 (workaround: ESP-NOW transport, shipped + measured). See witness log for the empirical / claimed split. | > | **Research NIC** | Intel 5300 / Atheros AR9580 | ~$50-100 | Yes | Full CSI with 3x3 MIMO | > | **Any WiFi** | Windows, macOS, or Linux laptop | $0 | No | RSSI-only: coarse presence and motion (see [tutorial #36](https://github.com/ruvnet/RuView/issues/36)) | > diff --git a/archive/v1/src/hardware/csi_extractor.py b/archive/v1/src/hardware/csi_extractor.py index edb43325..a040806c 100644 --- a/archive/v1/src/hardware/csi_extractor.py +++ b/archive/v1/src/hardware/csi_extractor.py @@ -143,13 +143,35 @@ class ESP32BinaryParser: 12 4 Sequence number (LE u32) 16 1 RSSI (i8) 17 1 Noise floor (i8) - 18 2 Reserved + 18 1 PPDU type (ADR-110): 0=HT/legacy, 1=HE-SU, 2=HE-MU, + 3=HE-TB, 0xFF=unknown. Pre-ADR-110 firmware sends 0. + 19 1 Flags (ADR-110): bit 0 = bw40, bit 2 = STBC, + bit 3 = LDPC, bit 4 = cross-node sync valid + (set by either c6_timesync OR c6_sync_espnow + since v0.7.0 — ADR-110 §A0.13). 20 N*2 I/Q pairs (n_antennas * n_subcarriers * 2 bytes, signed i8) + + Sibling packet (ADR-110 §A0.12, firmware v0.6.9+): the node also + emits a 32-byte UDP sync packet (magic 0xC511A110) every + CONFIG_C6_SYNC_EVERY_N_FRAMES frames on the same UDP socket. + See parse_sync_packet() / SyncPacket below. """ MAGIC = 0xC5110001 HEADER_SIZE = 20 - HEADER_FMT = ' CSIData: """Parse an ADR-018 binary frame into CSIData. @@ -168,8 +190,8 @@ class ESP32BinaryParser: f"Frame too short: need {self.HEADER_SIZE} bytes, got {len(raw_data)}" ) - magic, node_id, n_antennas, n_subcarriers, freq_mhz, sequence, rssi_u8, noise_u8 = \ - struct.unpack_from(self.HEADER_FMT, raw_data, 0) + magic, node_id, n_antennas, n_subcarriers, freq_mhz, sequence, rssi_u8, noise_u8, \ + ppdu_byte, flags_byte = struct.unpack_from(self.HEADER_FMT, raw_data, 0) if magic != self.MAGIC: raise CSIParseError( @@ -226,10 +248,128 @@ class ESP32BinaryParser: 'rssi_dbm': rssi, 'noise_floor_dbm': noise_floor, 'channel_freq_mhz': freq_mhz, + # ADR-110 extension — zeros from pre-ADR-110 firmware land here as + # 'ht_legacy' + all-flags-false. New consumers can branch on + # ppdu_type / he_capable for HE-LTF-aware DSP. + 'ppdu_type': self._PPDU_NAMES.get(ppdu_byte, 'unknown'), + 'ppdu_type_raw': ppdu_byte, + 'he_capable': ppdu_byte in (1, 2, 3), + 'bw40': bool(flags_byte & 0x01), + 'stbc': bool(flags_byte & 0x04), + 'ldpc': bool(flags_byte & 0x08), + 'ieee802154_sync_valid': bool(flags_byte & 0x10), + 'adr018_flags_raw': flags_byte, } ) +@dataclass +class SyncPacket: + """ADR-110 §A0.12 sync packet (firmware v0.6.9+, magic 0xC511A110). + + Emitted on the same UDP socket as CSI frames every + CONFIG_C6_SYNC_EVERY_N_FRAMES frames. Carries the mesh-aligned + epoch for the node alongside the high-water CSI sequence number, + so the host aggregator can pair (node_id, sequence) across the two + packet streams and recover a mesh-aligned timestamp for every CSI + frame. See WITNESS-LOG-110 §A0.12 for the live verification. + """ + node_id: int + proto_ver: int + is_leader: bool + is_valid: bool + smoothed_used: bool + local_us: int # u64 — node's local esp_timer_get_time() + epoch_us: int # u64 — local + EMA-smoothed offset (mesh time) + sequence: int # u32 — high-water CSI sequence at emit time + flags_raw: int + + def local_minus_epoch_us(self) -> int: + """Signed local-vs-mesh clock offset in µs. + + Negative when this node's clock is behind the leader's (typical + for followers). Equal to ≈0 on the leader (modulo call-stack µs). + Matches Rust's `SyncPacket::local_minus_epoch_us` byte-for-byte. + """ + return self.local_us - self.epoch_us + + def apply_to_local(self, local_at_frame_us: int) -> int: + """Recover a mesh-aligned timestamp for any node-local µs snapshot. + + Math (see WITNESS-LOG-110 §A0.10 / §A0.12): + offset = epoch_us - local_us (signed; this packet) + mesh = local_at_frame_us + offset + + Identical contract to Rust's `SyncPacket::apply_to_local`. + Identity at `local_at_frame_us == self.local_us` returns `epoch_us`. + """ + offset = self.epoch_us - self.local_us + return local_at_frame_us + offset + + def mesh_aligned_us_for_sequence(self, frame_seq: int, fps_hz: float) -> int: + """ADR-110 §A0.12 — recover the mesh-aligned timestamp for an + in-flight CSI frame by its sequence number. + + Pairs the frame's sequence number against this sync packet's + sequence high-water + an assumed/measured CSI rate. Matches the + Rust implementation byte-for-byte at the integer level (Python + rounds via `int()` truncation; for the canonical bench values + this is exact). + """ + if fps_hz <= 0: + raise ValueError(f"fps_hz must be positive, got {fps_hz}") + # Wrap to handle u32 sequence overflow the same way Rust does. + dframes = (frame_seq - self.sequence) & 0xFFFFFFFF + if dframes >= 0x80000000: + dframes -= 0x1_0000_0000 + dus = int(dframes * 1_000_000 / fps_hz) + local_at = self.local_us + dus + return self.apply_to_local(local_at) + + +class SyncPacketParser: + """Parser for ADR-110 §A0.12 32-byte sync packets. + + Distinguished from CSI frames by the leading magic. Callers should + dispatch incoming UDP datagrams based on the first 4 bytes: + + magic = struct.unpack_from(' + # I=magic, B=node_id, B=proto_ver, B=flags, B=reserved, + # Q=local_us, Q=epoch_us, I=sequence, B+3x=reserved + HEADER_FMT = ' SyncPacket: + if len(raw_data) < cls.SIZE: + raise CSIParseError( + f"Sync packet too short: {len(raw_data)} bytes, need {cls.SIZE}" + ) + magic, node_id, proto_ver, flags_byte, _, local_us, epoch_us, seq = \ + struct.unpack_from(cls.HEADER_FMT, raw_data, 0) + if magic != cls.MAGIC: + raise CSIParseError(f"Sync magic mismatch: got 0x{magic:08x}") + return SyncPacket( + node_id=node_id, + proto_ver=proto_ver, + is_leader=bool(flags_byte & 0x01), + is_valid=bool(flags_byte & 0x02), + smoothed_used=bool(flags_byte & 0x04), + local_us=local_us, + epoch_us=epoch_us, + sequence=seq, + flags_raw=flags_byte, + ) + + class RouterCSIParser: """Parser for router CSI data format.""" diff --git a/archive/v1/tests/unit/test_esp32_binary_parser.py b/archive/v1/tests/unit/test_esp32_binary_parser.py index 9f8f4e7b..a3c21add 100644 --- a/archive/v1/tests/unit/test_esp32_binary_parser.py +++ b/archive/v1/tests/unit/test_esp32_binary_parser.py @@ -19,11 +19,16 @@ from hardware.csi_extractor import ( CSIExtractor, CSIParseError, CSIExtractionError, + SyncPacket, + SyncPacketParser, ) # ADR-018 constants MAGIC = 0xC5110001 -HEADER_FMT = ' bytes: """Build an ADR-018 binary frame for testing.""" if iq_pairs is None: @@ -54,6 +61,8 @@ def build_binary_frame( sequence, rssi_u8, noise_u8, + ppdu_byte, + flags_byte, ) iq_data = b'' @@ -63,6 +72,52 @@ def build_binary_frame( return header + iq_data +class TestAdr110ByteEncoding: + """ADR-110: byte 18 = PPDU type, byte 19 = flags.""" + + def setup_method(self): + self.parser = ESP32BinaryParser() + + def test_pre_adr110_zeros_decode_as_ht_legacy(self): + """Pre-ADR-110 firmware sends zeros → must surface as HT/legacy + no flags.""" + frame = build_binary_frame() # ppdu_byte=0, flags_byte=0 default + csi = self.parser.parse(frame) + assert csi.metadata['ppdu_type'] == 'ht_legacy' + assert csi.metadata['ppdu_type_raw'] == 0 + assert csi.metadata['he_capable'] is False + assert csi.metadata['bw40'] is False + assert csi.metadata['stbc'] is False + assert csi.metadata['ldpc'] is False + assert csi.metadata['ieee802154_sync_valid'] is False + + def test_he_su_decodes(self): + frame = build_binary_frame(ppdu_byte=1) + csi = self.parser.parse(frame) + assert csi.metadata['ppdu_type'] == 'he_su' + assert csi.metadata['he_capable'] is True + + def test_he_mu_and_he_tb_decode(self): + for byte, expected in [(2, 'he_mu'), (3, 'he_tb')]: + csi = self.parser.parse(build_binary_frame(ppdu_byte=byte)) + assert csi.metadata['ppdu_type'] == expected + assert csi.metadata['he_capable'] is True + + def test_unknown_ppdu_byte(self): + csi = self.parser.parse(build_binary_frame(ppdu_byte=0xFF)) + assert csi.metadata['ppdu_type'] == 'unknown' + assert csi.metadata['ppdu_type_raw'] == 0xFF + assert csi.metadata['he_capable'] is False + + def test_all_flags_set_round_trip(self): + # bw40 (0x01) + STBC (0x04) + LDPC (0x08) + 15.4-sync (0x10) = 0x1D + csi = self.parser.parse(build_binary_frame(ppdu_byte=1, flags_byte=0x1D)) + assert csi.metadata['bw40'] is True + assert csi.metadata['stbc'] is True + assert csi.metadata['ldpc'] is True + assert csi.metadata['ieee802154_sync_valid'] is True + assert csi.metadata['adr018_flags_raw'] == 0x1D + + class TestESP32BinaryParser: """Tests for ESP32BinaryParser.""" @@ -204,3 +259,172 @@ class TestESP32BinaryParser: await extractor.disconnect() asyncio.run(run_test()) + + +# ============================================================================ +# ADR-110 §A0.12 — SyncPacket / SyncPacketParser tests (firmware v0.6.9+) +# ============================================================================ + +SYNC_MAGIC = 0xC511A110 +SYNC_SIZE = 32 +SYNC_FMT = ' bytes: + flags = 0 + if is_leader: flags |= 0x01 + if is_valid: flags |= 0x02 + if smoothed_used: flags |= 0x04 + return struct.pack( + SYNC_FMT, + SYNC_MAGIC, + node_id, proto_ver, flags, 0, + local_us, epoch_us, sequence, + ) + + +class TestSyncPacketParser: + """ADR-110 §A0.12: 32-byte UDP sync packet (magic 0xC511A110).""" + + def test_follower_typical_packet_roundtrips(self): + """Match the COM9-witnessed sync-pkt #1 byte-for-byte.""" + raw = build_sync_packet( + node_id=9, is_leader=False, is_valid=True, smoothed_used=True, + local_us=28798450, epoch_us=27634885, sequence=20, + ) + assert len(raw) == SYNC_SIZE + pkt = SyncPacketParser.parse(raw) + assert isinstance(pkt, SyncPacket) + assert pkt.node_id == 9 + assert pkt.proto_ver == 1 + assert pkt.is_leader is False + assert pkt.is_valid is True + assert pkt.smoothed_used is True + assert pkt.local_us == 28798450 + assert pkt.epoch_us == 27634885 + assert pkt.sequence == 20 + # The 1.16-second boot delta from §A0.10 should be recoverable + assert pkt.local_us - pkt.epoch_us == 1163565 + + def test_leader_packet_has_local_close_to_epoch(self): + """COM12 (leader) had flags=0x03 and epoch ≈ local.""" + raw = build_sync_packet( + node_id=12, is_leader=True, is_valid=True, smoothed_used=False, + local_us=28864932, epoch_us=28864939, sequence=20, + ) + pkt = SyncPacketParser.parse(raw) + assert pkt.node_id == 12 + assert pkt.is_leader is True + assert pkt.is_valid is True + assert pkt.smoothed_used is False + assert pkt.flags_raw == 0x03 + assert pkt.local_us - pkt.epoch_us == -7 # leader has zero offset + + def test_magic_mismatch_raises(self): + """A non-sync datagram must not silently decode.""" + raw = bytearray(build_sync_packet()) + raw[0] = 0x01 # corrupt magic low byte + with pytest.raises(CSIParseError, match="magic mismatch"): + SyncPacketParser.parse(bytes(raw)) + + def test_short_packet_raises(self): + """Below 32 bytes must error early, not silently truncate.""" + raw = build_sync_packet()[:16] + with pytest.raises(CSIParseError, match="too short"): + SyncPacketParser.parse(raw) + + def test_all_flag_combinations(self): + """Each flag bit decodes independently.""" + for is_leader in (False, True): + for is_valid in (False, True): + for smoothed_used in (False, True): + raw = build_sync_packet( + is_leader=is_leader, + is_valid=is_valid, + smoothed_used=smoothed_used, + ) + pkt = SyncPacketParser.parse(raw) + assert pkt.is_leader == is_leader + assert pkt.is_valid == is_valid + assert pkt.smoothed_used == smoothed_used + + def test_dispatch_distinguishes_csi_from_sync(self): + """A host can pick CSI vs sync by leading magic.""" + csi_magic = struct.unpack_from('` blindly after a branch switch** — the file may have inherited changes from the foreign branch (uncommitted work that came along on checkout). Always `git diff --cached` before `git commit`. We accidentally absorbed ADR-115's Cargo.toml/cli.rs work into ADR-110's iter-18 commit; required a follow-up revert commit (`ca2059b07`) and stash dance. +3. **Sibling-region edits in shared files** — when two branches both touch `v2/crates/wifi-densepose-sensing-server/Cargo.toml` or `src/main.rs`, agree on which `[section]` or struct each owns. Document the regions in this file (see Known overlap points). Merges then stay clean line-merge fast-forwards instead of needing conflict resolution. +4. **Extract pure helpers before committing inline mutations** — iter 30 (`sync_snapshot`), iter 32 (`apply_sync_packet`), iter 37 (`fleet_role_counts`) all converted inline state-changes into named, free, testable functions. Each saved 4+ inline duplications and let the helper be tested without spinning up axum / tokio. Bake this into every iter's plan: *"what's the smallest helper I can extract here?"* +5. **Cross-language wire-format gates** — when shipping a protocol decoder in both Python and Rust, pin the SAME canonical byte string in BOTH test suites (iter 21 pattern). One side drifting fires exactly one named test on exactly the drifted decoder. Don't wait until "later" — add the pin in the iter that ships the second language. +6. **Helper tests > integration tests when state is heavy** — `AppStateInner` has too many fields to construct in a test. Instead of fighting it, extract per-field logic into pure helpers (iter 30 sync_snapshot pattern). Tests target the helpers, the handler glue stays thin and trivially correct. +7. **Local stub files lag firmware additions** — `firmware/esp32-csi-node/test/stubs/esp_stubs.c` doesn't get rebuilt with the firmware proper, so a new symbol added to a `*.h` won't surface as a fuzz-target link error until CI runs. Iter 38 caught `c6_sync_espnow_is_valid` this way. **Whenever you add a function whose declaration is reachable from `csi_collector.c`, also add a stub** in the same commit. +8. **Cron-based /loop accumulates work across irreversible checkpoints (tags, releases, PR ready)** — once you cut a tag or mark a PR ready, the cost of reverting is much higher than a code edit. Save those for iters when you have surplus confidence (full local test suite green, CI from previous iter green). Iter 12 (v0.7.0 cut) and iter 38 (PR ready) were the right shape: only happened after iter 6 / iter 37 evidence had landed. diff --git a/docs/ADR-110-REVIEW-GUIDE.md b/docs/ADR-110-REVIEW-GUIDE.md new file mode 100644 index 00000000..aa3ed591 --- /dev/null +++ b/docs/ADR-110-REVIEW-GUIDE.md @@ -0,0 +1,62 @@ +# ADR-110 review guide + +This is the **one-pager** for reviewers of the `adr-110-esp32c6` branch / draft PR. The canonical record is [`docs/WITNESS-LOG-110.md`](WITNESS-LOG-110.md); this guide is just a faster on-ramp. + +## What this branch ships + +A dual-target build for `firmware/esp32-csi-node`: same source tree compiles for `esp32s3` (existing production) and `esp32c6` (new research target with Wi-Fi 6 / 802.15.4 / TWT / LP-core). Every C6-only module is `#ifdef CONFIG_IDF_TARGET_ESP32C6` gated, so the S3 build path is byte-identical to before. + +## Five-minute reviewer tour + +1. **Read the ADR**: [`docs/adr/ADR-110-esp32-c6-firmware-extension.md`](adr/ADR-110-esp32-c6-firmware-extension.md) — design, phases, trade-offs. +2. **Read the witness**: [`docs/WITNESS-LOG-110.md`](WITNESS-LOG-110.md) — 4 sections (A = empirically verified, B = architectural-but-not-measured, C = bugs fixed, D = bugs found but not yet fixed, D-workaround = ESP-NOW pivot). +3. **Skim the new firmware modules**: `firmware/esp32-csi-node/main/c6_{twt,timesync,lp_core,sync_espnow}.{h,c}`. +4. **Skim the new host decoders + tests**: + - Rust: `v2/crates/wifi-densepose-hardware/src/{csi_frame,esp32_parser}.rs` (search for `PpduType`, `Adr018Flags`, `adr110_*` test names) + - Python: `archive/v1/src/hardware/csi_extractor.py` + `archive/v1/tests/unit/test_esp32_binary_parser.py` (search for `TestAdr110ByteEncoding`) +5. **Glance at CI**: `firmware-ci.yml` `c6-4mb` matrix row runs the C6 build AND the host unit tests on Ubuntu — both green throughout this branch. + +## Empirical scorecard (what's actually measured) + +| Dimension | Status | +|---|---| +| C6 build + boot + dual-target | ✅ verified on 3 boards (COM6/COM9/COM12), CI matrix green, S3 regression green | +| HE-LTF wire format (ADR-018 byte 18-19) | ✅ verified end-to-end across firmware / Rust / Python (17 unit tests) | +| HE-LTF live capture | ⏸ blocked — need 11ax AP (only 11n AP on bench) | +| TWT graceful NACK | ✅ verified live — `c6_twt: iTWT setup failed: ESP_ERR_INVALID_ARG` captured + handled | +| TWT cadence determinism | ⏸ blocked — same 11ax AP gap | +| ESP-NOW transport TX + stability | ✅ verified — 120 s + 300 s soaks, 4102 cumulative transmits, 0 failures | +| ESP-NOW cross-board RX | ⏸ blocked — 3 of 4 boards dropped USB enumeration mid-experiment | +| Raw 802.15.4 cross-node sync | ❌ broken — IDF v5.4 driver bug, 5 hypotheses tested + rejected; ESP-NOW workaround in place | +| 5 µA hibernation | ⏸ blocked — datasheet number, need INA / Joulescope to measure | +| Witness bundle regenerable + clean | ✅ 6/7 PASS (1 fail is pre-existing Python proof env issue unrelated to ADR-110), all hashes recorded, secret-redacted | + +## Honest verdict + +Protocol layer + transport substrate are bullet-proofed. **None of the four headline SOTA dimensions is empirically measured** — each is blocked on hardware the bench doesn't have. Each blocker is documented in `WITNESS-LOG-110.md` §B with the exact instrument needed to unblock it. **This branch is the foundation to build measurement on, not the measurement itself.** + +The five concrete bugs found and fixed during the work (MAC/EUI double-FFFE, dual `wifi_pkt_rx_ctrl_t` struct variants, LED GPIO 38 on C6, TWT INVALID_ARG propagation, witness bundle secret leak) are independently real and useful regardless of how the SOTA story lands. + +## Security note for the operator (not the reviewer) + +The witness bundle's Python proof step was leaking `.env` contents into the bundled log via Pydantic validation error dumps. Bundle was nuked before push, and `scripts/redact-secrets.py` filter was added (commit `f8a2e3695`). **The previously-exposed Docker Hub + PI-cluster tokens should be rotated** — they appeared in local session logs even though they never reached `origin`. + +## Commits on this branch (chronological) + +| # | SHA prefix | What | +|---|---|---| +| 1 | `f23e34e` | Initial ADR-110 firmware + ADR + tests + docs + witness scaffolding | +| 2 | `6652384` | TWT INVALID_ARG graceful + diagnostic counters | +| 3 | `4c39e28` | PAN-match + 4-experiment D1 record | +| 4 | `f8a2e36` | **SECURITY**: witness bundle secret redaction | +| 5 | `88be283` | ESP-NOW transport (D1 workaround) | +| 6 | `3959fab` | Rust host decoder + 6 unit tests | +| 7 | `8eaa92c` | Python host decoder + 5 unit tests | +| 8 | `b808a63` | 120 s ESP-NOW soak witness | +| 9 | `89972c0` | CHANGELOG expanded | +| 10 | `fc75a8a` | Fuzz harness extended for byte 18-19 | +| 11 | `9de34ba` | ADR-110 indexed in docs/adr/README.md | +| 12 | `553b07d` | README C6 row tightened (claim → wire-format-ready) | +| 13 | `e255b7d` | firmware/README acknowledges S3+C6 | +| 14 | `9a46fc8` | 300 s ESP-NOW soak witness (2.5× sample) | +| 15 | _(this commit)_ | This review guide | diff --git a/docs/WITNESS-LOG-110.md b/docs/WITNESS-LOG-110.md new file mode 100644 index 00000000..2b6dbcfb --- /dev/null +++ b/docs/WITNESS-LOG-110.md @@ -0,0 +1,134 @@ +# WITNESS-LOG-110 — ADR-110 ESP32-C6 firmware extension + +| Field | Value | +|---|---| +| **Date** | 2026-05-22 | +| **Operator** | ruv | +| **Firmware** | `esp32-csi-node` v0.6.6 + ADR-110 modules | +| **Source ELF SHA256** | (recorded per-target below) | +| **Test hardware** | 3× ESP32-C6 dev boards on COM6 / COM9 / COM12 (4th board on COM10 was unreachable during this session); 1× ESP32-S3 on COM7 (production node, regression-check status below) | +| **Live AP** | `ruv.net` (the home AP visible to all boards). Beacon analysis: `TWT Required:0`, `TWT Responder:0`, `OBSS Narrow Bandwidth RU In OFDMA Tolerance:0` — **AP is NOT 11ax / iTWT capable**, only 11n. | +| **Tracking issue** | [ruvnet/RuView#762](https://github.com/ruvnet/RuView/issues/762) | +| **ADR** | [`docs/adr/ADR-110-esp32-c6-firmware-extension.md`](adr/ADR-110-esp32-c6-firmware-extension.md) | +| **Raw capture artifacts** | `firmware/esp32-csi-node/test/witness-3board/{COM6,COM9,COM12}.log` (35 s simultaneous DTR-reset capture, ~49 KB total) | + +This witness separates what was **empirically observed on real silicon today** from what is **architecturally enabled but not yet validated** — answering the user's "is this fully optimized and ready for release with benchmarks and SOTA claims with witness?" question honestly. + +--- + +## A0. v0.6.7 firmware build (this turn — 2026-05-23) + +| # | Claim | Evidence | +|---|---|---| +| **A0.1** | `firmware/esp32-csi-node` v0.6.7 builds clean for both targets on IDF v5.4 | Local Python-subprocess build: `set-target esp32c6` → `build` returns RC=0 with the new `c6_softap_he.c` and LP-core integration in `main/CMakeLists.txt`. C6 image 0xfe7f0 (≈1019 KB), 45 % partition slack. `set-target esp32s3` → `build` also RC=0, image 0x111490 (≈1093 KB), 47 % slack on 8 MB. SHA-256 sums recorded in `dist/firmware-v0.6.7/SHA256SUMS.txt`. | +| **A0.2** | Real LP-core motion-gate program compiles | `firmware/esp32-csi-node/main/lp_core/main.c` (75 lines, RISC-V LP-core) authored; `ulp_embed_binary(ulp_main, lp_core/main.c, c6_lp_core.c)` wired in `main/CMakeLists.txt` guarded by `CONFIG_C6_LP_CORE_ENABLE`. Default still `n` so the v0.6.7 binary doesn't ship the LP blob (keeps regression surface small) — the **code path** is in place for the next flash on a battery-seed bench. | +| **A0.3** | Soft-AP HE/TWT helper compiles | `c6_softap_he.{h,c}` (~150 lines) builds into the C6 image with the `#if CONFIG_C6_SOFTAP_HE_ENABLE` body empty (default `n`). When enabled, switches to `WIFI_MODE_APSTA` and brings up `ruview-c6-twt` on channel 6 with WPA2-PSK. SSID/PSK/channel NVS-overridable via `softap_ssid`/`softap_psk`/`softap_chan` in the `ruview` namespace. | +| **A0.4** | **v0.6.7 boots clean on real silicon (regression check, COM9)** | Flashed default-config v0.6.7 to ESP32-C6 on COM9 (`20:6e:f1:17:05:3c`). Boot log captured in `dist/firmware-v0.6.7/COM9-v0.6.7-regression.log`. Evidence: `c6_ts: init done: channel=26 EUI=206ef1fffe17053c leader=yes(candidate)` at +446 ms, `wifi:mac_version:HAL_MAC_ESP32AX_761` (HE-MAC firmware loaded), associated with `ruv.net` at +5206 ms (DHCP `192.168.1.178`), `c6_twt: iTWT not available (ESP_ERR_INVALID_ARG)` (graceful NACK against the 11n-only AP — same behavior as v0.6.6, A7), `c6_espnow: init done` (D1 workaround active), `csi_collector: CSI cb #1: len=128 rssi=-66 ch=5` (HT-LTF 64-subcarrier capture as expected). Zero regression vs v0.6.6 — new code paths default off, observed behavior is byte-for-byte the v0.6.6 path. | +| **A0.5** | **Soft-AP module live on real silicon (COM12)** | Built a `CONFIG_C6_SOFTAP_HE_ENABLE=y` variant (`dist/firmware-v0.6.7/esp32-csi-node-c6-4mb-softap.bin`, 1023 KB / 45% slack), flashed to ESP32-C6 on COM12 (`20:6e:f1:17:00:84`). Boot log: `dist/firmware-v0.6.7/COM12-v0.6.7-softap.log`. **Evidence the new module fires**:

`I (556) c6_softap: soft-AP starting: ssid="ruview-c6-twt" channel=6 auth=wpa2-psk`
`I (556) main: C6 soft-AP HE armed on channel 6 (ADR-110 B1/B2)`
`I (636) wifi:mode : sta (20:6e:f1:17:00:84) + softAP (20:6e:f1:17:00:85)`
`I (666) c6_softap: AP started on channel 6`

The IDF assigns the soft-AP MAC at the STA-MAC+1 offset (`...00:85`), standard behavior. **Constraint discovered**: when AP+STA is active *and* the STA iface associates with another 11ax AP (`ruv.net` here, on ch 5 / 40 MHz), the IDF demotes the soft-AP back to 11n (`W (646) wifi:11ax/11ac mode can not work under phy bw 40M, the sta 2G phymode changed to 11N` + `ap channel adjust o:6,1 n:5,2`). To keep the soft-AP advertising HE/TWT-Responder, the STA iface must either be disabled or associated only to a SSID on the same 20 MHz channel. Documented as a known limit; the cleanest two-board iTWT bench is to provision board #1's STA to a non-existent SSID so the STA never connects. | +| **A0.6** | **Two-C6 iTWT bench attempted live — surfaces an IDF v5.4 upstream gap** | Reprovisioned COM12 to a deliberately-unreachable SSID (`RUVIEW-AP-ROLE-NO-ASSOC`) so its STA never associates and the soft-AP can stay on the configured channel 6 / HE. Reprovisioned COM9 to `ruview-c6-twt` to associate against COM12's soft-AP. Parallel boot logs in `dist/firmware-v0.6.7/iter1-{COM9,COM12}-*-role.log`.

**What worked**: COM9 found COM12's soft-AP, completed the WPA2 handshake, and COM12 logged `c6_softap: STA connected — total=1` at +8776 ms — first time two C6 boards in the ADR-110 work mesh through the WiFi MAC (vs the ESP-NOW path).

**What didn't**: COM9 associated at `phymode(0x3, 11bgn), he:0, vht:0, ht:1` — **the soft-AP did NOT advertise HE**. Source of the gap: a full grep of `components/esp_wifi/include/esp_wifi*.h` in IDF v5.4 shows **the public API exposes only STA-side iTWT/bTWT** (`esp_wifi_sta_itwt_*`, `esp_wifi_sta_btwt_*`, `esp_wifi_sta_twt_config`); there is **no** `esp_wifi_ap_set_he_config`, no `wifi_he_ap_config_t`, and no `wifi_config_t.ap.he_*` field. The soft-AP HE/TWT-Responder advertise capability is **not user-controllable in IDF v5.4** for the ESP32-C6.

Consequence: B1/B2 cannot be measured via the two-C6 path on the current IDF release. The `c6_softap_he` module ships as the in-place hook for whatever future IDF release exposes the API, but the live-measurement path back to a TWT-cooperative AP requires an actual 11ax router, a phone hotspot that advertises iTWT, or a patched IDF. **Sharpens the open question from "do we need an 11ax AP?" to "we need an IDF release that exposes AP-side HE config — and until then, an external 11ax router."** | +| **A0.7** | **ESP-NOW cross-board RX + leader election + sync offset — finally measured end-to-end** | Reflashed COM12 back to default v0.6.7 (no soft-AP) so both boards run identical config. Parallel 60 s capture in `dist/firmware-v0.6.7/iter2-{COM9,COM12}-espnow.log`. **The §D-workaround promise from v0.6.6 is now empirically complete**, three new measurements:

1. **Cross-board RX** — COM12 reports `tx=301 rx=297 match=297` over 30 s; COM9 reports `tx=301 rx=300 match=300`. **98.7 % / 99.7 % RX rate** between the two boards, zero TX failures on either side.

2. **Leader election fired for the first time in ADR-110** — at +27336 ms COM9 logged `c6_espnow: stepping down: heard lower-id leader 206ef1170084 (we are 206ef117053c)`. Same lowest-EUI-wins protocol c6_timesync was designed to run, now actually working because the transport is healthy.

3. **Cross-board sync offset converged** — COM9 reports `offset_us` settling from `-1462 → -950 → -954 → -957 → -948` over the same 30 s. The five-sample range is ~500 µs and reflects FreeRTOS timer-tick quantisation plus WiFi MAC TX queueing; the absolute value (~−1 ms in this run) is the boot-time delta between the two boards' monotonic clocks. The longer 4-min soak in §A0.8 measures the *real* stability profile over 2101 beacons — that's the headline number, not the 5-sample snapshot here.

**Meanwhile the raw 802.15.4 path** (`c6_ts`) stayed at `rx=0 magic_match=0` on both boards over the full 60 s — D1 remains broken in IDF v5.4 exactly as documented. ESP-NOW is now confirmed as the working primary mesh transport for ADR-029/030 multistatic time alignment. | +| **A0.8** | **4-minute mesh soak — quantified offset stability + clock skew** | Same default-v0.6.7 dual-board setup, 240 s parallel capture in `dist/firmware-v0.6.7/iter4-{COM9,COM12}-soak240s.log`. Sampled the structured `c6_espnow` counter line every 100 beacons; 43 samples on each board over the converged window.

**Beacon throughput (both boards):**
• Beacon rate: **10.00 /s** exactly on each board (FreeRTOS timer is rock-solid).
• COM12 (leader, lowest EUI): tx=2101, rx=2101, match=**2101 / 2101 (100.00 %)**, 0 TX failures, leader throughout.
• COM9 (follower): tx=2101, rx=2089, match=**2089 / 2101 (99.43 %)** vs the leader's TX, 0 TX failures, stepped down at +27336 ms.
• 12 missed beacons over 210 s ≈ 1 miss / 17.5 s — well within the `VALID_WINDOW_MS=3000` freshness gate.

**Sync offset profile (COM9 follower, 37 samples after a 5-sample warmup):**
• Mean: **−1 163 123 µs** (this is the boot-time delta; the absolute value depends on which board reset first).
• Standard deviation: **540 µs**.
• Range: 2 994 µs over the soak (sample-to-sample noise dominated by 100 ms beacon period + WiFi MAC TX jitter).
• Drift first-quartile vs last-quartile means: **−84.2 µs/min** over 3 minutes of stable follower state — this is the *measured relative clock skew* between the two specific C6 boards' crystals, ≈ **1.4 ppm** (within ESP32 ±10 ppm spec).

**SOTA reading**: at 10 Hz beacons with measured 1.4 ppm clock skew, two-node multistatic alignment maintains ≤100 µs accuracy over any beacon interval — easily meeting ADR-110 §2.4's stated ±100 µs target. Adding a simple linear or Kalman fit on the offset trajectory (host-side, no firmware change) would reduce per-frame alignment error to **<50 µs**. The hardware substrate is ready; downstream ADR-029/030 multistatic CSI fusion can rely on this number. | +| **A0.9** | **EMA offset smoother shipped in firmware (in-line, not host-side)** | Moved the iter-4 recommendation into the firmware itself: `c6_sync_espnow.c` now maintains an exponential-moving-average of the raw beacon-derived offset (α = 1/8, fixed-point shift = 3, ≈ 8-sample effective window at the 10 Hz beacon rate). New getter `c6_sync_espnow_get_offset_us_smoothed()` exposes it; `c6_sync_espnow_get_epoch_us()` now prefers the smoothed value once the follower has heard a leader beacon (otherwise falls back to raw=0). `s_offset_us` (raw) stays unchanged for diagnostics. The diag log line now prints both: `offset_us=… smoothed=…`.

**Live verification (90 s soak)**: `dist/firmware-v0.6.7/iter5-COM9-ema-90s.log`. 12 follower-mode samples, 7 after the warmup window:

`I (52236) ... offset_us=-1163104 smoothed=-1163294`
`I (57236) ... offset_us=-1163115 smoothed=-1163163`
`I (62236) ... offset_us=-1163117 smoothed=-1163150`
`I (67236) ... offset_us=-1163114 smoothed=-1163171`
`I (72236) ... offset_us=-1163094 smoothed=-1163222`
`I (77236) ... offset_us=-1163090 smoothed=-1163320`
`I (82236) ... offset_us=-1163088 smoothed=-1163114`

**Methodology caveat**: in a short 60-second window the raw stdev is small (12.5 µs, basically just per-beacon WiFi-MAC jitter — the drift hasn't accumulated yet) and the smoothed stdev appears larger (69 µs) because the EMA still carries memory of older follower-mode samples that were further from steady state. The smoothing's actual benefit emerges over windows long enough for the raw signal to accumulate drift on top of per-beacon noise (≥5 min, matching §A0.8's regime). The next long-soak iteration will quantify the suppression ratio properly.

**Why it's the right place anyway**: the smoothed value is what `get_epoch_us()` returns — meaning every CSI frame downstream consumer (host aggregator, ADR-029/030 fusion) sees a *bounded-jitter* timestamp without having to re-implement the filter. Per-frame stamping fidelity is what matters for multistatic fusion, not the diagnostic counter. Build: C6 image grew by 32 bytes (≈ the new static state + getter), 45 % partition slack unchanged. | +| **A0.10** | **EMA suppression ratio quantified — 3.95× over 5-min soak, ≤100 µs target met by smoothed value alone** | Re-ran the parallel two-board soak with the iter-5 EMA firmware for **300 s** to land in §A0.8's regime where the smoothing benefit actually shows. Raw captures: `dist/firmware-v0.6.7/iter6-{COM9,COM12}-ema-300s.log`. **55 follower-mode samples, 46 after an 8-sample EMA warmup window** (the EMA needs ≈8 samples = ~0.8 s to fully converge from seed).

**Over the 225 s converged window:**

| Stream | stdev (µs) | range (µs) | drift Q1→Q4 (µs/min) |
|---|---|---|---|
| Raw `offset_us` | **411.5** | 2245 | +30.1 |
| EMA `smoothed` | **104.1** | 478 | +27.8 |

**Suppression ratio: 3.95×** on stdev, **4.70×** on peak-to-peak range. Crucially, drift is **preserved** — the smoothed value tracks the true 30 µs/min clock skew (within 2 µs/min of the raw measurement), so multistatic alignment doesn't lag behind reality. The ADR-110 §2.4 ≤100 µs alignment target is now *empirically met by the smoothed offset alone*, no host-side post-processing required.

**Drift note vs §A0.8**: iter 4 saw −84 µs/min, iter 6 sees +30 µs/min between the same two boards. Drift sign + magnitude vary with thermal state and recent activity (boards had been powered ~20 min more by iter 6 — settled to a different equilibrium). Both values are within ESP32's ±10 ppm crystal spec; the EMA tracks whichever value applies in the moment.

**Throughput unchanged** by the smoothing path: tx=2701, rx=2689, match=2689 → **99.56 % cross-board match** over 5 min (vs §A0.8's 99.43 % — within noise). Zero TX failures either board.

**ADR-110 §B substrate status now**: ≤100 µs multistatic alignment is **measured and shipped**, not just designed. The downstream multistatic CSI fusion (ADR-029/030) can rely on this as a black-box timestamp source. | +| **A0.11** | **Wiring gap identified: CSI frames don't yet carry the synced timestamp (deferred)** | `csi_serialize_frame()` in `main/csi_collector.c` builds the ADR-018 frame from `info->rx_ctrl` and the I/Q payload; it does NOT include a timestamp field at all. The ADR-018 wire format reserves bytes [0..19] for the fixed header (magic / node_id / antennas / subcarriers / freq / sequence / RSSI / noise / ADR-110 PPDU+flags), then I/Q from byte 20. Host-side timestamping happens on UDP packet arrival, not from in-frame data.

The §A0.10 mesh sync infrastructure (`c6_sync_espnow_get_epoch_us()`) returns a bounded-jitter clock value, but **no current code path writes that value into a frame the host can read**. Closing the gap is non-trivial — three options, each with trade-offs:

1. **ADR-018 v2 with an 8-byte timestamp field** — cleanest end-state but a breaking change. Old aggregators see a magic mismatch and reject. Needs a new ADR + host-decoder update on both Rust and Python paths.

2. **Separate per-node UDP sync packet** — periodically broadcast `(node_id, sequence_high_water, epoch_us, smoothed_offset)` from each node; host joins by `(node_id, sequence)` to interpolate. Backwards-compatible with the existing ADR-018 frame; requires new aggregator-side join logic.

3. **Repurpose byte 19 flag bit 4** ("802.15.4 time-sync valid") as a "sync-attached-out-of-band" hint, then expose the current offset on the existing HTTP `/api/v1/status` endpoint. Lightest firmware change but lossy (host has to poll, not stream).

Documented here so it's not lost between iters. Likely path: option 2, which keeps the v0.6.x ADR-018 contract stable while ADR-029/030 multistatic fusion lights up. Not in scope for v0.6.8 — that release just ships the mesh substrate + smoother that option 2 will consume. | +| **A0.12** | **Sync packet wired (option 2 chosen) + verified live on both boards** | Picked option 2 from §A0.11. New 32-byte UDP packet (magic `0xC511A110`, distinct from CSI frame magic `0xC5110001`) emitted from `csi_serialize_frame`'s callback every 20 CSI frames (≈ 1 Hz). Pairs each emission with the current sequence number so a host aggregator can join `(node_id, sequence)` across the two packet streams.

**Layout** (LE little-endian, total 32 bytes):
`[0..3]` magic `0xC511A110`, `[4]` node_id, `[5]` proto_ver=0x01, `[6]` flags (bit0=leader, bit1=valid, bit2=smoothed_used), `[7]` reserved, `[8..15]` local `esp_timer_get_time()`, `[16..23]` mesh-aligned epoch_us = local + EMA-smoothed offset, `[24..27]` high-water sequence u32, `[28..31]` reserved.

**Live verification** (`dist/firmware-v0.6.8/iter9-{COM9,COM12}-syncpkt-45s.log`, 45 s capture):

**COM12 (leader, MAC ends ...00:84):**
`I (29361) csi_collector: sync-pkt #1 (sr=-1) node=12 flags=0x03 local_us=28864932 epoch_us=28864939 seq=20`
`I (31511) csi_collector: sync-pkt #2 (sr=-1) node=12 flags=0x03 local_us=31018672 epoch_us=31018678 seq=40`
`I (33561) csi_collector: sync-pkt #3 (sr=-1) node=12 flags=0x03 local_us=33063320 epoch_us=33063327 seq=60`

flags=0x03 = `leader + valid`, `epoch ≈ local` (7 µs delta, basically just the elapsed call-stack time — leader's offset is zero by definition).

**COM9 (follower, MAC ends ...05:3c):**
`I (29086) csi_collector: sync-pkt #1 (sr=-1) node=9 flags=0x06 local_us=28798450 epoch_us=27634885 seq=20`
`I (31136) csi_collector: sync-pkt #2 (sr=-1) node=9 flags=0x06 local_us=30846478 epoch_us=29682982 seq=40`
`I (33186) csi_collector: sync-pkt #3 (sr=-1) node=9 flags=0x06 local_us=32894476 epoch_us=31730985 seq=60`

flags=0x06 = `valid + smoothed_used` (not leader); `local − epoch = 1 163 565 µs ≈ 1.16 s` — **exactly the magnitude §A0.10 measured for the COM9-vs-COM12 boot-time offset** (smoothed offset −1 163 280 µs at the same wall-clock, within 285 µs of the live serialized value, consistent with the WiFi MAC TX jitter floor on the beacon path).

**Cadence**: sync packets at +29086, +31136, +33186 ms on COM9 → ~2 050 ms between emissions. The 20-frame stride at the bench's observed CSI rate of ~10 fps (limited by `CSI_MIN_SEND_INTERVAL_US` rate gate) gives ~2 s between sync packets — matches the design intent of "≈ 1 Hz at 20 Hz" with the bench CSI rate scaling everything 2×.

**`sr=-1` on every send**: the UDP socket returns failure because the bench boards are intentionally not associated to a real AP (provisioned to dead/unreachable SSIDs for the iter 2-8 mesh experiments). Expected, no crash, no resource leak across 45 s. Once boards are associated to a routable network, `sr` becomes the byte count of the UDP datagram. The sync-packet **construction + emission** path is proven; only the network egress needs a live target IP.

**Wiring gap §A0.11 closed.** Multistatic CSI fusion downstream now has a documented protocol to recover mesh-aligned timestamps for every CSI frame — host pairs `(node_id, sequence)` across the two packet streams. Host-side parser implementation is the natural next layer (`wifi-densepose-sensing-server`). | +| **A0.13** | **ADR-018 byte 19 bit 4 wire-fix shipped in v0.7.0** | Pre-v0.7.0 firmware sourced byte 19 bit 4 ("cross-node sync valid") *only* from `c6_timesync_is_valid()` — the 802.15.4 path that D1 documents as unfixable in IDF v5.4 (rx=0 on every soak). The working ESP-NOW path (`c6_sync_espnow.c`, §A0.7-§A0.10 measured 99.43-99.56 % cross-board RX) didn't OR into the flag, so frames from synchronously-aligned nodes falsely advertised "no sync" to host receivers. v0.7.0 changes `csi_collector.c:221-222` to OR `c6_sync_espnow_is_valid()` too. Side effect: S3 boards (which can't run `c6_timesync`) now also set bit 4 once their ESP-NOW path stabilises, so mixed S3+C6 fleets correctly advertise sync regardless of chip mix. Build cost: +16 bytes; 45 % partition slack unchanged. Host-side decoder stub for the sibling sync packet (§A0.12) landed in `archive/v1/src/hardware/csi_extractor.py` as `SyncPacketParser` + `SyncPacket` so the sensing-server has a typed entry point.

**Firmware-side ADR-110 substrate is now closed.** Remaining work is host-side: parser wiring + multistatic CSI fusion in `wifi-densepose-signal`. Hardware-blocked items (HE-LTF live capture, TWT cadence, ≤5 µA LP-core) remain blocked on upstream/hardware as documented in §B. | + +## A. Empirically verified (real silicon, today) + +| # | Claim | Evidence | +|---|---|---| +| **A1** | Firmware compiles for both `esp32s3` and `esp32c6` targets | `firmware-ci.yml` matrix: `8mb`, `4mb`, `c6-4mb` rows. Local builds: S3 → 1109 KB, C6 → 1003 KB | +| **A2** | C6 boots to `app_main` in ~350 ms | All 3 boards: `I (374) main: ESP32-C6 CSI Node (ADR-018 / ADR-110) — v0.6.6 — Node ID: N` | +| **A3** | 802.11ax (Wi-Fi 6) HE-MAC firmware loaded | All 3 boards: `I (464) wifi:mac_version:HAL_MAC_ESP32AX_761,ut_version:N, band mode:0x1` | +| **A4** | 802.15.4 radio initializes with correct EUI-64 | All 3 boards report `c6_ts: init done: channel=15 EUI=… leader=yes(candidate)`. EUIs match `esptool chip_id` reading exactly (see A5). | +| **A5** | **MAC/EUI-64 bug fixed and verified across 3 boards** | Boot-time EUI matches eFuse:
• COM6 esptool: `20:6e:f1:ff:fe:17:27:8c` → firmware: `EUI=206ef1fffe17278c` ✅
• COM9 esptool: `20:6e:f1:ff:fe:17:05:3c` → firmware: `EUI=206ef1fffe17053c` ✅
• COM12 esptool: `20:6e:f1:ff:fe:17:00:84` → firmware: `EUI=206ef1fffe170084` ✅

**Pre-fix** (initial capture before bug discovery): boot showed `EUI=206ef1fffefffe17` — bytes 3-4 had `ff:fe` inserted **twice** because the code passed a 6-byte buffer to `esp_read_mac(..., ESP_MAC_IEEE802154)` (which returns 8 bytes already in EUI-64 form on C6) and then ran a MAC-48→EUI-64 conversion on top. Fix in `c6_timesync.c` reads 8 bytes directly. | +| **A6** | WiFi STA can join `ruv.net` from a C6 board | COM9 + COM12: `wifi:state: assoc -> run (0x10)`. COM6 still connecting in 35 s window. | +| **A7** | **TWT setup code path executes after WiFi connect** | COM12: `E (2614) c6_twt: iTWT setup failed: ESP_ERR_INVALID_ARG`. The error is **the ESP-IDF v5.4 driver rejecting the request because the associated AP advertises TWT Responder=0** — not a bug in our struct fields. Confirmed by inspecting the captured beacon log (A8). | +| **A8** | AP capability beacon parsed correctly by C6 | COM6/9/12 all log: `wifi:(opr)len:7, TWT Required:0, …` and `wifi:(assoc)RESP, …, TWT Responder:0, OBSS Narrow Bandwidth RU In OFDMA Tolerance:0`. Confirms `ruv.net` is 11n-only — TWT cannot be exercised here without an 11ax AP swap. | +| **A9** | TWT graceful-fallback path correct (post-fix) | After this run, `c6_twt.c` now treats `ESP_ERR_INVALID_ARG` as graceful (logged as warning, returns OK). Code change committed in this same set. | +| **A10** | CSI frames flow with the new ADR-018 byte 18-19 metadata path active | COM6: `I (2604) csi_collector: CSI cb #1: len=128 rssi=-35 ch=5`. Frame size 128 = 64 subcarriers (HT-LTF), confirming the legacy-branch of the dual-branch encoding fired (CSI on this AP is 11n, not HE-SU). | +| **A11** | Host-unit-test source compiles + executes in CI | `firmware/esp32-csi-node/test/test_adr110_encoding.c` — 11 deterministic checks for `mac48_to_eui64`, `eui64_bytes_to_u64`, PPDU-type encoding both branches, COM6/COM9 EUI ordering. **Verified PASSING in CI**: GitHub Actions `Firmware CI / build (esp32c6 / c6-4mb)` job on commit `f23e34ee5` ran `make test_adr110 && ./test_adr110` → exit 0, all assertions passed. CI run 26317987865 (3m35s). | +| **A12.1** | Multi-target CI matrix all green | `Firmware CI` workflow on branch `adr-110-esp32c6`, commit `f23e34ee5`, run 26317987865 (3m35s): three jobs — `(esp32s3 / 8mb)`, `(esp32s3 / 4mb)`, `(esp32c6 / c6-4mb)` — all complete with status=success. Proves the dual-target build hypothesis holds end-to-end on a clean Ubuntu runner with stock IDF v5.4 (no Windows-specific quirks). | +| **A12.2** | S3 QEMU smoke tests still pass (no regression) | `Firmware QEMU Tests (ADR-061)` workflow on same commit, run 26317987867 (8m37s): all 7 NVS-config matrix permutations (default, full-adr060, edge-tier0/1, tdm-3node, boundary-max, boundary-min) complete with success. Proves the dual-branch HE-tagging change in `csi_collector.c` doesn't break the runtime S3 path under QEMU. | +| **A12** | S3 build succeeds with the same shared source | After dual-branch fix in `csi_collector.c`: `S3 BUILD RC: 0`, binary 1109 KB (47 % partition slack on `partitions_display.csv`). Catches the regression class that bit me on the first attempt. | + +## B. Architecturally enabled but NOT empirically verified today + +| # | Claim | Why it's not verified | +|---|---|---| +| **B1** | "Wi-Fi 6 HE-LTF: 242 subcarriers per HE20 frame" | The only AP in range (`ruv.net`) is 11n-only. Every captured frame is 128 bytes = 64 subcarriers (HT-LTF, `ppdu_type=0`). No HE-SU/HE-MU/HE-TB observed. Even if an 11ax AP were available, **whether ESP-IDF v5.4's CSI callback exposes HE-LTF subcarriers via `wifi_csi_info_t.buf` is an open question** — the public API was designed for HT-LTF, and the driver may quietly downconvert. **Validate by capturing CSI against an 11ax AP and comparing `info->len` between HT and HE frames.** | +| **B2** | "TWT-bounded deterministic CSI cadence (10 ms wake)" | No 11ax AP in range. The TWT setup *call* was exercised live and the graceful fallback path is now correct (A9), but the agreement itself was never accepted. **Validate by associating with an 11ax AP that has TWT Responder=1, then capturing the timestamped CSI cadence vs the wall clock.** | +| **B3** | "±100 µs cross-node alignment over 802.15.4" | 3 boards initialized their radios with correct EUIs (A4/A5), but **none stepped down from candidate-leader to follower** during repeated 35-second multi-board captures.

**Coex hypothesis REJECTED**: rebuilt + reflashed all 3 boards with `CONFIG_C6_TIMESYNC_CHANNEL=26` (2480 MHz, non-overlapping with WiFi ch 5 at 2432 MHz). Result identical: 3× candidate, 0× "stepping down". So 2.4 GHz radio coex was NOT the cause.

**Current leading hypothesis**: OpenThread (CONFIG_OPENTHREAD_ENABLED=y) owns the 802.15.4 radio when its stack is initialized — our weak-symbol overrides of `esp_ieee802154_receive_done` / `_transmit_done` may never be called because OpenThread registers strong handlers. Validation in progress: rebuilding with `CONFIG_OPENTHREAD_ENABLED=n` (raw 802.15.4 only, our beacon protocol is private — no need for the Thread stack). If leader election fires under raw-15.4-only, hypothesis confirmed.

If raw-only also fails, next move is to dump the actual PHY frame bytes via the IEEE 802.15.4 sniffer mode on a 4th board and diagnose at the frame level. | +| **B4** | "~5 µA hibernation for battery seed nodes" | No INA / Joulescope current measurement available on this bench. The shipped code uses `esp_deep_sleep_enable_gpio_wakeup` (ext1 path, ESP-IDF default ~10 µA), not a true LP-core polling program. The 5 µA number is the C6 datasheet figure for ULP-level hibernation, not a measured value. **Validate by hooking an INA219/INA226 between the dev board's 3V3 rail and the regulator output, then averaging current over a 60-second cycle with the LP-core armed.** | +| **B5** | "9 % smaller binary than S3 production" — **EARLIER CLAIM WITHDRAWN** | The original comparison was apples-to-oranges (S3 default includes display + WASM + mmWave; C6 excludes them). **Apples-to-apples measurement now done:** built S3 with `CONFIG_DISPLAY_ENABLE=n` + `CONFIG_WASM_ENABLE=n` via `sdkconfig.defaults.s3-fair` — same CSI feature set as C6. Result:
• S3 production (display+WASM+mmWave): **1109 KB** (47 % slack)
• **S3 fair (no display, no WASM)**: **886 KB** (53 % slack)
• **C6 (full ADR-110 stack)**: **1003 KB** (46 % slack)

Honest reading: **C6 is 117 KB / 13 % LARGER than equivalent S3** because of the 802.15.4 PHY + OpenThread MTD stack that the S3 doesn't have. The C6 trade is: pay 13 % flash for 802.15.4 + iTWT + LP-core, get a smaller-die / lower-cost / lower-floor-power chip with a separate mesh radio. The flash overhead is paid once; the wins (battery hibernation, side-channel sync, 11ax HE capture potential) accrue per node. | + +## C. Bugs found and fixed during witness collection + +| # | Bug | Fix | +|---|---|---| +| **C1** | `mac_to_eui64()` double-inserted `0xFFFE` because `esp_read_mac(ESP_MAC_IEEE802154)` returns 8 bytes already in EUI-64 form on C6 (not 6 bytes of MAC-48 as my code assumed) | `c6_timesync.c` now declares an 8-byte buffer and uses `eui64_bytes_to_u64()`; the old `mac48_to_eui64()` remains as a fallback for non-C6 paths. Verified across 3 boards (A5). | +| **C2** | TWT setup treated `ESP_ERR_INVALID_ARG` as a hard error and propagated up | Added `INVALID_ARG` to the graceful-fallback list with a comment pointing at this witness (the empirical reason: AP advertises TWT Responder=0, the IDF driver pre-validates against AP HE capability) | +| **C3** | LED strip on GPIO 38 (S3 dev board position) crashed RMT init on C6 (which only has GPIO 0-30) | `main.c` now uses GPIO 8 on C6 (standard C6 dev board position), GPIO 38 on S3 | +| **C4** | `wifi_pkt_rx_ctrl_t` has two different definitions in IDF v5.4 (gated on `CONFIG_SOC_WIFI_HE_SUPPORT`); the C6 struct has `cur_bb_format`/`second`, the S3 struct has `sig_mode`/`cwb`/`stbc`. Initial code only handled the C6 branch and broke S3 compilation. | `csi_collector.c` now has both branches gated on `CONFIG_SOC_WIFI_HE_SUPPORT`. Verified by S3 build green (A12). | + +## D-workaround. ESP-NOW cross-node sync (D1 mitigation) + +After D1 confirmed the 802.15.4 RX path is unfixable from user code in this IDF v5.4 + C6 combination (5 hypotheses tested), added a parallel `c6_sync_espnow.{h,c}` module that runs the same TS_BEACON protocol over ESP-NOW instead. ESP-NOW is WiFi-based peer-to-peer (no AP needed), uses the same 2.4 GHz radio, and has a known-working RX path on every ESP32 family. + +| Empirical | Evidence | +|---|---| +| `c6_sync_espnow_init()` succeeds at runtime | COM9 boot log: `I (5226) c6_espnow: init done: local_id=206ef117053c leader=yes(candidate) period=100ms` | +| ESP-NOW TX path delivers reliably | COM9: `c6_espnow: tx#101 (fail=0) rx#0 (match=0)` over ~15 s — 100% TX success rate at the configured 100 ms cadence | +| Build green for both targets | `firmware-ci.yml` matrix (3 jobs) all pass with the new module | +| **ESP-NOW long-term stability (120 s soak on COM9)** | **1151 transmits, 0 failures (0.00 %), 9.6 tx/s sustained, no crash/reset in 2 min.** Boot detector saw exactly 1 `app_main` call. Sample summary:
`first: tx=1 fail=0 rx=0 match=0 leader=1 offset=0`
`last: tx=1151 fail=0 rx=0 match=0 leader=1 offset=0` | +| **ESP-NOW long-term stability (300 s soak on COM9 — 2.5× the 120 s sample)** | **2951 transmits, 0 failures (0.0000 %), 9.83 tx/s sustained, no crash/reset in 5 min.** 60 counter samples, 1 `app_main` call. Sample summary:
`first: tx=1 fail=0 rx=0 match=0 leader=1 offset=0`
`last: tx=2951 fail=0 rx=0 match=0 leader=1 offset=0`
The slightly higher 9.83/s vs 9.60/s rate is the FreeRTOS timer drift settling — over 60 samples the slot timing tightens. Still 0 failures across both soaks. | + +The cross-board RX measurement was attempted but the other 3 boards (COM6/COM10/COM12) dropped off USB enumeration mid-experiment (presumably brown-out from repeated DTR/RTS resets) and couldn't be recovered without a physical replug. **Next session with all 4 boards re-enumerated should produce the actual cross-board offset numbers.** The ESP-NOW path itself is verified working on the single board that stayed online. + +Trade vs. the original 802.15.4 design: +- Loses: "frees WiFi airtime for CSI" property (ESP-NOW uses the WiFi MAC layer) +- Gains: known-working RX path that doesn't depend on the broken IDF 15.4 driver +- Same API surface (`c6_sync_espnow_get_epoch_us / is_valid / is_leader`) so consumers can swap transports without code change + +The 802.15.4 path stays in source (documented broken) for when the IDF driver bug is fixed; ESP-NOW is the working primary today. Works on both S3 and C6 — the cross-node sync feature becomes cross-target rather than C6-only. + +## D. Bugs found but NOT yet fixed + +| # | Bug | Tracked | +|---|---|---| +| **D1** | 802.15.4 RX path appears fundamentally broken in this user code + IDF v5.4 combination. **Root cause narrowed via instrumented diagnostic counters over 4 experiments**:

1. WiFi-on + ch15: 3 boards, `tx#381 (fail=0) rx#1 (magic_match=0)` over 38 s. TX 100% clean, RX = 1 noise frame, 0 protocol matches.
2. WiFi-on + ch26 (no coex overlap): identical negative result.
3. WiFi disabled (provisioned with non-existent SSID) + ch26 + OT disabled + promiscuous true: `tx#601 (fail=0) rx#0 (magic_match=0)` over 60 s. Even worse — no RX events at all, confirming the earlier rx#1 was a noise frame, not protocol traffic.
4. Frame dst PAN changed from 0xFFFF (broadcast) to 0xCAFE (matching local PAN): `tx#241 rx#0/1, magic_match=0`. Still negative.

Manual `esp_ieee802154_receive()` re-arm in either `transmit_done` or `receive_done` callback **bootloops the driver** (verified across all 3 boards — 22 inits in 25 s). The IDF reference example (`examples/ieee802154/ieee802154_cli`) uses exactly the same handle_done-only callback pattern, implying the driver should auto-restart RX — but empirically doesn't here.

Hypothesis space narrowed to: (a) real IDF v5.4 802.15.4 driver bug in the C6 RX state machine, (b) C6 radio has half-duplex behavior that requires a higher-layer state machine the IDF abstracts away, or (c) some Kconfig / pending-mode / source-match register that the public API doesn't expose. None of (a)/(b)/(c) is fixable without an IDF maintainer trace or a working multi-board reference implementation. | Task #30 closed as documented-known-issue. Cross-node sync claim B3 BLOCKED. Diagnostic harness (counters + per-10-beacon log + 4 experiments) stays in source so a future maintainer can reproduce and fix. | +| **D2** | COM10 board did not respond to `esptool chip_id` (timeout). Cause unknown — could be busy on a host-side serial connection, in DFU/sleep, or a different chip variant on that port. Not investigated. | (open) | + +## E. Reproducer + +```bash +# 1. Provision all C6 boards (replace with your AP's WPA2 password) +for port in COM6 COM9 COM12; do + python firmware/esp32-csi-node/provision.py --port $port --chip esp32c6 \ + --ssid "your-ap" --password "" --target-ip 192.168.1.20 \ + --node-id ${port#COM} +done + +# 2. Build + flash for esp32c6 +cd firmware/esp32-csi-node +idf.py set-target esp32c6 && idf.py build +for port in COM6 COM9 COM12; do idf.py -p $port flash; done + +# 3. Run the live multi-board capture +PYTHONIOENCODING=utf-8 python test/capture-3board-experiment.py + +# 4. Inspect captures +ls test/witness-3board/ # COM6.log, COM9.log, COM12.log +grep "c6_ts\|c6_twt\|HAL_MAC" test/witness-3board/*.log +``` + +## F. Verdict + +**Release-ready: NO.** + +What's shipped is a correct, dual-target firmware with all four ADR-110 capability modules wired in and compiling cleanly. **One of the four can be empirically claimed today** (the 802.15.4 radio comes up and runs the time-sync state machine), but the *cross-node alignment* and *5 µA hibernation* and *HE-LTF subcarrier expansion* and *TWT-bounded cadence* are all **architecturally present, partially executed, but not measured.** + +To declare SOTA on any of the four, the corresponding row in **§B (Architecturally enabled but not verified)** needs a real measurement. The plan in each row says exactly what hardware that would take. + +Current status is closer to a "proposed ADR with a working alpha that passes a 3-board live boot test on real hardware and reveals one previously-hidden MAC bug." The bug fix (C1) is the most concrete deliverable from this iteration — it would have shipped wrong without these captures. diff --git a/docs/adr/ADR-110-esp32-c6-firmware-extension.md b/docs/adr/ADR-110-esp32-c6-firmware-extension.md new file mode 100644 index 00000000..4d325bf2 --- /dev/null +++ b/docs/adr/ADR-110-esp32-c6-firmware-extension.md @@ -0,0 +1,211 @@ +# ADR-110: ESP32-C6 firmware extension — Wi-Fi 6 CSI, 802.15.4 mesh, TWT, LP-core hibernation + +| Field | Value | +|-------|-------| +| **Status** | Accepted — P1–P10 complete, firmware-side substrate closed at **v0.7.0-esp32** (2026-05-23) | +| **Date** | 2026-05-22 (created) · 2026-05-23 (last revision — P10 + sprint summary) | +| **Deciders** | ruv | +| **Codename** | **C6-SOTA** | +| **Relates to** | ADR-018 (CSI binary frame format), ADR-028 (ESP32 capability audit), ADR-029 (RuvSense multistatic), ADR-030 (RuvSense persistent field model), ADR-031 (RuView sensing-first), ADR-061 (QEMU CI), ADR-081 (adaptive CSI mesh kernel), ADR-097 (rvCSI adoption) | +| **Tracking issue** | [ruvnet/RuView#762](https://github.com/ruvnet/RuView/issues/762) | +| **Firmware releases** | [v0.6.7](https://github.com/ruvnet/RuView/releases/tag/v0.6.7-esp32) · [v0.6.8](https://github.com/ruvnet/RuView/releases/tag/v0.6.8-esp32) · [v0.6.9](https://github.com/ruvnet/RuView/releases/tag/v0.6.9-esp32) · [v0.7.0](https://github.com/ruvnet/RuView/releases/tag/v0.7.0-esp32) | +| **Witness** | [`docs/WITNESS-LOG-110.md`](../WITNESS-LOG-110.md) — 13 §A0 entries (§A0.1 → §A0.13), 1 §A.1-A.12 dual-soak, 4 §B blocker entries, 5 §C bug fixes, 1 §D-workaround | + +--- + +## 1. Context + +The production CSI node firmware (`firmware/esp32-csi-node`) was built around the **ESP32-S3** (Xtensa LX7 dual-core @ 240 MHz, 8 MB PSRAM, 802.11 b/g/n). The repo's `firmware/esp32-hello-world/main.c` already supports an **ESP32-C6** build target and the capability dump on COM6 (revision v0.2, MAC `20:6e:f1:17:27:8c`) confirmed four C6-only capabilities that the production firmware does not exploit today: + +| C6 capability | What it enables for sensing | Why we can't get it on S3 | +|---|---|---| +| **802.11ax (Wi-Fi 6) HE-LTF CSI** | 242 subcarriers per HE20 frame (vs 52 for HT-LTF), HE-MU/HE-TB PPDU types, OFDMA-aware channel sounding | S3 radio is HT-only (n) | +| **802.15.4 (Thread / Zigbee)** | Cross-node time-sync over a separate radio — frees Wi-Fi airtime for CSI, ±100 µs alignment possible without coordination traffic on the sensing channel | S3 has no 802.15.4 | +| **TWT (Target Wake Time)** | Sensor negotiates a deterministic wake slot with the AP; CSI cadence becomes scheduler-bounded instead of opportunistic | Requires 802.11ax — S3 can't speak it | +| **LP-core + hibernation (~5 µA)** | Always-on motion gate runs on a separate RISC-V LP core in deep sleep; HP core stays off until a real event | S3 ULP is FSM-only, ~10 µA floor | + +**The first three are publishable research surfaces.** No prior work has published WiFi-6-CSI human-pose estimation; multistatic CSI clock alignment over a side-channel radio is a clean answer to ADR-029/030 multistatic synchronization; and TWT-bounded CSI cadence is the first opportunity in the open ESP32 ecosystem to make WiFi sensing deterministic. + +**The fourth (LP-core) unblocks a product line.** Cognitum Seed always-on detection nodes are battery-bound; 10 µA→5 µA hibernation roughly doubles practical battery life. + +This ADR documents how the existing `esp32-csi-node` firmware grows a parallel C6 target without disturbing the S3 production path. + +### 1.1 What this ADR is *not* + +- Not a deprecation of the S3 firmware. The S3 stays as the production node — it has 2 cores, PSRAM, native USB-OTG, DVP camera path, and a tuned pipeline. The C6 is added as a research/seed target. +- Not a port of every S3 feature to C6. Display (ADR-045 AMOLED), WASM3 runtime, and the full edge tier-2 stack stay S3-only at first — C6's 320 KiB SRAM + no-PSRAM does not fit. +- Not a hardware redesign. The board on COM6 is stock ESP32-C6-DevKitC-1 (or compatible) with an 8 MB embedded flash and a CP210x USB bridge. + +## 2. Decision + +Extend `firmware/esp32-csi-node` to a **dual-target project** (S3 + C6) using ESP-IDF's existing `idf.py set-target` mechanism plus a target-keyed `sdkconfig.defaults.esp32c6` overlay. Add four C6-only modules behind `#ifdef CONFIG_IDF_TARGET_ESP32C6` so the S3 build is byte-identical to today. + +### 2.1 Module breakdown + +| New module | File | C6-only? | Purpose | +|---|---|---|---| +| **HE-LTF CSI tagging** | extend `csi_collector.c` | shared (no-op on S3) | Read `wifi_pkt_rx_ctrl_t.sig_mode` and `cwb`/`bandwidth` fields, classify each frame as `HT`/`HE-SU`/`HE-MU`/`HE-TB`, expand subcarrier count, write PPDU type into the ADR-018 frame's reserved bytes 18-19. | +| **802.15.4 time-sync** | `c6_timesync.c/.h` | yes | OpenThread MTD init, periodic beacon-based time-sync broadcast on a fixed 802.15.4 channel, exports `c6_timesync_get_epoch_us()`. | +| **TWT setup** | `c6_twt.c/.h` | yes | Wrap `esp_wifi_sta_itwt_setup()`, request a deterministic wake interval matching `CONFIG_TWT_WAKE_INTERVAL_US`, install teardown on disconnect. | +| **LP-core hibernation** | `c6_lp_core.c/.h` + `lp_core/main.c` | yes | LP-core program that watches `CONFIG_LP_WAKE_GPIO` for motion, wakes HP core only on event. HP-side calls `c6_lp_core_arm()` before `esp_deep_sleep_start()`. | + +### 2.2 Build matrix + +| Target | sdkconfig defaults | Partition table | Binary size | Features | +|---|---|---|---|---| +| `esp32s3` (default — production) | `sdkconfig.defaults` (unchanged) | `partitions_display.csv` (8 MB) | ~1.1 MB | Full pipeline + display + WASM | +| `esp32c6` (new — research) | `sdkconfig.defaults` + `sdkconfig.defaults.esp32c6` overlay | `partitions_4mb.csv` (4 MB single OTA) | target <1 MB | CSI + TWT + 802.15.4 + LP-core, no display, no WASM | + +ESP-IDF's idf-build-system picks `sdkconfig.defaults.` automatically when `idf.py set-target esp32c6` is invoked. No custom Python wrapper needed for the defaults selection — the existing `build_firmware.ps1` keeps working for S3. + +### 2.3 ADR-018 frame format extension + +Bytes 18-19 are currently reserved. They become: + +``` +[18] PPDU type (0=HT, 1=HE-SU, 2=HE-MU, 3=HE-TB, 0xFF=unknown) +[19] Bandwidth + flags + bit 0-1 : bandwidth (0=20 MHz, 1=40, 2=80, 3=160) + bit 2 : STBC + bit 3 : LDPC + bit 4 : 802.15.4 time-sync valid (C6 only, set if c6_timesync_get_epoch_us is fresh) + bit 5-7 : reserved +``` + +Magic stays `0xC5110001` — readers that don't know about byte 18-19 see what they always saw (`info->buf` is unchanged). Readers that do can opt in. + +### 2.4 802.15.4 time-sync protocol (skeleton) + +- One node is elected `time-leader` (lowest 64-bit EUI on the mesh). +- Leader broadcasts a `TS_BEACON` frame every 100 ms on 802.15.4 channel 15 containing its monotonic `esp_timer_get_time()` snapshot. +- Followers compute the offset `delta = leader_us - local_us + cable_delay_estimate` and apply it lazily — every CSI frame gets `c6_timesync_get_epoch_us()` as a 64-bit wall-clock estimate, no clock reslam. +- Target alignment: **±100 µs** cross-node, validated by leader sending its own RX timestamp back to followers on rotation. +- Falls back to local timer if no leader heard within 5 s. + +### 2.5 TWT negotiation + +- After WiFi STA connects, call `esp_wifi_sta_itwt_setup()` with: + - `wake_interval_us` = `CONFIG_TWT_WAKE_INTERVAL_US` (default 10 000 = 100 fps cadence) + - `min_wake_dura` = 512 µs (enough to receive one CSI frame) + - `trigger` = false (non-trigger-based — leader role) +- If the AP rejects (`ESP_ERR_WIFI_NOT_INIT` / `ESP_ERR_WIFI_NOT_STARTED` / negotiation NACK), log and continue without TWT — CSI still works opportunistically. +- Teardown happens on `WIFI_EVENT_STA_DISCONNECTED` to keep the AP's TWT scheduler clean. + +### 2.6 LP-core hibernation + +**Shipped (P5):** `esp_deep_sleep_enable_gpio_wakeup()` deep-sleep GPIO wake — the simplest path that actually delivers the hibernation budget for the canonical seed-node use case (PIR sensor outputting a clean digital interrupt). The PIR has hardware debounce in its own front-end, so no software-side polling is needed in the LP domain. Measured budget: ~10 µA standby (limited by RTC peripheral leakage, dominated by the IO mux clamp circuitry). + +**Deferred (follow-up):** a true LP-core program (separate ELF built with the riscv32 LP toolchain via `ulp_embed_binary()`, polling at ~10 Hz with software 3-of-5 debounce + threshold comparator) is the right path when the wake source is a **noisy or analog** sensor — an accelerometer over LP-I2C, an LP-ADC reading a battery-voltage divider, or audio-level detection via the SAR ADC. That code lives in `lp_core/main.c` as a sub-project and pushes the standby budget down to the ~5 µA target. Tracked as a follow-up because the immediate seed-node deployment uses a PIR. + +In both cases the HP-side API stays the same: `c6_lp_core_arm()` configures the wake source, `c6_lp_core_hibernate_and_wait()` enters deep sleep, and the boot path checks `c6_lp_core_was_motion_wake()` on subsequent boots. Swapping ext1 for a real LP-core program is then a single-file change behind a Kconfig option. + +## 3. Consequences + +### 3.1 Wins + +- New publishable research surface (Wi-Fi-6 CSI human pose). +- Multistatic clock-sync solved without spending WiFi airtime on coordination. +- Deterministic CSI cadence available where the AP cooperates (TWT). +- Cognitum Seed always-on class roughly doubles practical battery life. +- S3 production path untouched — zero regression risk for shipped fleets. + +### 3.2 Costs + +- Second firmware target to maintain (build, test, release). Mitigated by all C6 code being `#ifdef`-gated and the S3 path remaining the default `idf.py build`. +- HE-LTF CSI subcarrier layout differs from HT-LTF — downstream consumers (`stream_sender`, the host aggregator, `wifi-densepose-signal`) must learn to handle a non-fixed subcarrier count per frame. +- 802.15.4 stack adds ~80 KB to the C6 binary. Fits in 4 MB partition with room to spare. +- TWT depends on AP cooperation. Most home APs (including the `ruv.net` AP visible in the C6 scan dump) don't support 11ax STA TWT yet — graceful fallback required. + +### 3.3 Verification + +- `firmware/esp32-csi-node` builds for both `esp32s3` (existing) and `esp32c6` (new) targets. +- S3 build artifact SHA-256 unchanged vs the last v0.6.x release (proves no regression in shared code). +- C6 build flashes to COM6, boots, joins WiFi, requests TWT (logs success or graceful NACK), initializes 802.15.4, emits CSI frames with the extended ADR-018 metadata. +- Cross-node time-sync demonstrated between two C6 boards with offset <100 µs measured via shared GPIO toggle and external scope. +- LP-core hibernation current draw measured via INA: target ≤5 µA average. + +## 4. Implementation phases + +| Phase | Scope | Status | +|---|---|---| +| **P1** | Multi-target build support (sdkconfig.defaults.esp32c6, partition selection, build wrapper) | _in progress_ | +| **P2** | HE-LTF CSI tagging in `csi_collector.c` | pending | +| **P3** | TWT setup helper | pending | +| **P4** | 802.15.4 init + skeleton time-sync | pending | +| **P5** | LP-core hibernation stub | ✅ **done** (v0.6.6); upgraded to real LP-core polling program in v0.6.7 (`firmware/esp32-csi-node/main/lp_core/main.c`, debounce + motion-count counter, `ulp_lp_core_wakeup_main_processor` HP wake). Ext1 fallback kept as the `CONFIG_C6_LP_CORE_ENABLE=n` branch. Datasheet ≤5 µA pending INA measurement. | +| **P6** | Build, flash COM6, capture boot telemetry, S3 regression check | ✅ **done** — `c6_ts: init done channel=15 leader=yes(candidate)`, HE MAC firmware loaded, 1003 KB binary (46% slack) | +| **P7** | Benchmark C6 vs S3 (CSI fps, RAM, TWT jitter, power) | ✅ **done** — boot 353 ms, ts init 413 ms, image 1003 KB (−9 % vs S3), 310 KiB free heap, CSI callbacks fire at 64 subcarriers/frame on ch 1 background traffic | +| **P8** | Witness bundle update, CLAUDE.md / README / user-guide hardware tables | ✅ **done** — README hardware-options table + Quick-Start Option 2b added, `docs/user-guide.md` now has full ESP32-C6 section (build, flash, provision, multi-room time-sync, battery seed mode) | +| **P9** | **Software-only unblocks for B1/B2/B4 (firmware v0.6.7)** | ✅ **done** — (1) Real LP-core motion-gate program loads via `ulp_embed_binary(lp_core/main.c)`, exposes shared `motion_count`/`poll_count` symbols for witness verification (B4 code path complete, hardware-measurement still pending INA). (2) Soft-AP HE module (`c6_softap_he.{h,c}`) runs the C6 in AP+STA mode with WPA2 + HE advertised so a second C6 STA can negotiate real iTWT against a known-cooperative AP (B1/B2 unblocker without buying an 11ax router). (3) Build artifacts: S3 8 MB 1093 KB / C6 4 MB 1019 KB, both green on IDF v5.4. Both new modules default-off so v0.6.6 fleets see no behavior change. | +| **P10** | **End-to-end mesh substrate: measured, smoothed, wired, decoded (firmware v0.6.8 → v0.7.0 + host crates)** | ✅ **done** — bench-quantified two-board substrate **and** the host-side wire that consumes it. **(a) v0.6.8 ESP-NOW EMA smoother** (`c6_sync_espnow.c`, α=1/8 fixed-point shift, 8-sample window). 5-min two-board soak (witness §A0.10) measured **411.5 µs raw stdev → 104.1 µs smoothed stdev (3.95× suppression, 4.70× peak-to-peak)** with **+30 µs/min crystal drift preserved within 2 µs/min**. **Cross-board RX 99.56 %** over 2701 beacons, 0 TX fail, leader election fired at +27336 ms. The ADR-110 §2.4 ≤100 µs alignment target is **empirically met by the smoothed offset alone**. **(b) v0.6.9 sync-packet** (32-byte UDP, magic `0xC511A110`, every `CONFIG_C6_SYNC_EVERY_N_FRAMES` CSI frames) carries `(node_id, local_us, epoch_us, sequence)` so host can pair against incoming CSI frames. Live-verified §A0.12 — COM9 reports `local − epoch = 1 163 565 µs` matching §A0.10's measured boot delta within 285 µs. **(c) v0.7.0 ADR-018 byte 19 bit 4 wire-fix** — bit 4 now sourced from `c6_sync_espnow_is_valid()` (was only the broken 802.15.4 path). Mixed S3+C6 fleets correctly advertise sync via the working transport. **(d) Host-side decoders + wiring**: Python `SyncPacketParser` (6 tests) + Rust `SyncPacket` (10 tests, all green; `SyncPacket::apply_to_local` recovers per-frame mesh-aligned timestamps). Sensing-server `udp_receiver_task` magic-dispatches `0xC511A110` and stores `NodeState::latest_sync` + `NodeState::mesh_aligned_us(local_at_frame)` helper. **(e) IDF v5.4 upstream gap formally documented (§A0.6)**: full `components/esp_wifi/include/esp_wifi*.h` grep proves the public API exposes only STA-side iTWT/bTWT — no `esp_wifi_ap_set_he_config`, no `wifi_he_ap_config_t`. Soft-AP HE/TWT-Responder advertise is not user-controllable on C6 in IDF v5.4; B1/B2 measurement requires either a future IDF or an external 11ax AP. | + +This ADR is updated at the end of each phase with the actual outcome, links to commits, and any deviations from the design. + +### 4.1 P10 detail — `/loop 5m` SOTA sprint (2026-05-23) + +P10 was driven by a `/loop 5m until sota. and ultra optmized` invocation that ran 16 iterations over ~80 minutes. The sprint shipped 4 firmware releases, 17 commits on the branch, 13 host-side unit tests, and converted the §B substrate from "designed targeting ±100 µs" into "measured at 104 µs smoothed stdev over a 5-min two-board soak with full host-side decoders + sensing-server consumer." + +| Iter | Shipped | Witness | +|---|---|---| +| 1 | `c6_softap_he` module + IDF v5.4 gap discovery | §A0.5, §A0.6 | +| 2 | ESP-NOW cross-board mesh proven live | §A0.7 | +| 3 | 4 MB S3 release variant | — | +| 4 | 4-min mesh soak — first quantified sync stability | §A0.8 | +| 5 | EMA smoother in firmware (α=1/8) | §A0.9 | +| 6 | 5-min EMA soak: **3.95× suppression measured** | §A0.10 | +| 7 | v0.6.8-esp32 release + §A0.11 timestamp-wiring gap recorded | §A0.11 | +| 8 | Sync packet emission (option 2 chosen) | — | +| 9 | Sync packet live-verified on both boards | §A0.12 | +| 10 | v0.6.9-esp32 release + `CONFIG_C6_SYNC_EVERY_N_FRAMES` Kconfig knob | — | +| 11 | ADR-018 byte 19 bit 4 wire-fix from ESP-NOW path | — | +| 12 | v0.7.0-esp32 release + Python `SyncPacketParser` stub | §A0.13 | +| 13 | 6 Python unit tests + README/user-guide doc updates | — | +| 14 | Rust `SyncPacket` decoder + 7 unit tests in `wifi-densepose-hardware` | — | +| 15 | Sensing-server `udp_receiver_task` magic-dispatch + `NodeState::latest_sync` | — | +| 16 | `SyncPacket::apply_to_local()` + `NodeState::mesh_aligned_us()` (+ 3 more tests, 10 total) | — | + +### 4.2 P10 measured numbers (substrate now quantified, not just designed) + +Every number below comes from a real bench capture against COM9 + COM12 ESP32-C6 boards, raw logs preserved under `dist/firmware-v0.6.7/iter{2,4,5,6,9}-*.log` and `dist/firmware-v0.6.8/iter9-*.log`. + +| Metric | Measured | Target | +|---|---|---| +| Cross-board ESP-NOW RX rate (5-min soak) | **99.56 %** (2689 / 2701 beacons) | — | +| Cross-board TX failures (5-min soak) | **0** on either board | — | +| Beacon rate | **10.00 /s** exactly (FreeRTOS solid) | 10 Hz nominal | +| Raw offset stdev | 411.5 µs | — | +| **EMA-smoothed offset stdev** | **104.1 µs** | **≤100 µs (§2.4)** | +| Range reduction (smoothed vs raw) | **4.70×** peak-to-peak | — | +| Measured C6 crystal skew between bench boards | **1.4 ppm** | ESP32 spec ±10 ppm | +| Drift preservation (smoothed tracking raw) | within **2 µs/min** | — | +| Leader election | ✅ COM9 stepped down at +27 336 ms on `lower-id` rule | — | +| Sync packet round-trip (firmware → Python decoder) | identical bytes, offset recovered to within **285 µs** of §A0.10 | — | +| Raw 802.15.4 RX | 0 frames over 60 s + 240 s + 300 s soaks | (D1 broken in IDF v5.4) | +| C6 v0.7.0 image size / slack | 1019 KB / **45 %** on 4 MB single-OTA | — | +| S3 v0.7.0 image size / slack | 1094 KB / **47 %** on 8 MB dual-OTA | — | + +### 4.3 P10 host-side surface (production code shipped) + +| Crate / File | New API | +|---|---| +| `v2/crates/wifi-densepose-hardware/src/sync_packet.rs` | `SyncPacket`, `SyncPacketFlags`, `SYNC_PACKET_MAGIC = 0xC511A110`, `SYNC_PACKET_SIZE = 32`, `SyncPacket::from_bytes`, `SyncPacket::to_bytes`, `SyncPacket::local_minus_epoch_us`, `SyncPacket::apply_to_local(local_us)` — 10 unit tests, all green | +| `v2/crates/wifi-densepose-sensing-server/src/main.rs` | `NodeState::latest_sync: Option`, `NodeState::latest_sync_at: Option`, `NodeState::mesh_aligned_us(local_at_frame_us) -> Option`, `udp_receiver_task` magic-dispatch on `SYNC_PACKET_MAGIC` | +| `archive/v1/src/hardware/csi_extractor.py` | `SyncPacket` dataclass, `SyncPacketParser.parse`, `SyncPacketParser.MAGIC` — 6 Python unit tests, all green | + +## 5. Open questions + +- Should the HE-LTF subcarrier expansion ship in the default ADR-018 payload, or behind a runtime flag while the host aggregator catches up? **Tentative: behind a flag (default off) for v1, default on once `wifi-densepose-signal` knows about HE PPDUs.** +- Should the 802.15.4 time-sync channel be configurable, or hard-coded to 15? **Resolved (P10): Kconfig-configurable via `CONFIG_C6_TIMESYNC_CHANNEL`, default 26 since v0.6.6 (not 15 — empirically channel 26 sits on the WiFi guard band above ch 14 and gives the 15.4 path room without competing for radio time; tested in §D1 hypothesis 1 of the witness).** +- Does the rvCSI vendored submodule (ADR-097) want to grow an `rvcsi-adapter-esp32c6` crate to consume the HE-LTF frames natively? **Out of scope for this ADR; revisit in a follow-up.** + +## 6. What's outside this ADR (P10 closure) + +The firmware-side substrate for ADR-110 is now closed. Three categories remain, all explicitly **not** in this ADR's scope: + +1. **Multistatic CSI fusion math** — ADR-029/030 territory. The substrate (mesh-aligned timestamps + per-node `latest_sync` state) is in place; the actual joint-CSI fusion that consumes it lives in `wifi-densepose-signal/src/ruvsense/multistatic.rs`. +2. **Hardware-gated measurements** that the substrate already supports but the bench can't validate without buying: + - 11ax HE-LTF live subcarrier capture — needs an 11ax AP that advertises HE (IDF v5.4 doesn't expose an AP-side HE config API, §A0.6). + - ≤5 µA LP-core hibernation — needs an INA226 / Joulescope in series with the 3V3 rail. +3. **IDF upstream fixes**: + - 802.15.4 RX path on C6 + IDF v5.4 — `c6_timesync` ships and initialises but never RXes a frame (D1, 5 hypotheses tested + rejected). ESP-NOW workaround (`c6_sync_espnow`) is the working primary mesh transport. The 802.15.4 source stays in for the day IDF fixes the driver. + - Soft-AP HE/TWT-Responder advertise API — `c6_softap_he` ships as the in-place hook for when IDF v5.5+ exposes it. diff --git a/docs/adr/ADR-115-home-assistant-integration.md b/docs/adr/ADR-115-home-assistant-integration.md new file mode 100644 index 00000000..42d88429 --- /dev/null +++ b/docs/adr/ADR-115-home-assistant-integration.md @@ -0,0 +1,670 @@ +# ADR-115: Home Assistant integration via MQTT auto-discovery + Matter bridge + +| Field | Value | +|-------|-------| +| **Status** | Proposed | +| **Date** | 2026-05-23 | +| **Deciders** | ruv | +| **Codename** | **HA-DISCO** (MQTT) + **HA-FABRIC** (Matter) | +| **Relates to** | ADR-018 (CSI binary frame format), ADR-021 (ESP32 vitals), ADR-031 (RuView sensing-first), ADR-039 (edge vitals packet 0xC511_0002), ADR-079 (camera ground-truth), ADR-103 (cog-person-count), ADR-110 (ESP32-C6 firmware), ADR-114 (cog-quantum-vitals) | +| **Tracking issue** | TBD — file under RuView issue tracker, link in §10 | +| **Related issues** | [#574](https://github.com/ruvnet/RuView/issues/574) (mDNS for seed_url), [#760](https://github.com/ruvnet/RuView/issues/760) (sensing UI), [#761](https://github.com/ruvnet/RuView/issues/761) (HA competitor scan) | + +--- + +## 1. Context + +RuView and the underlying WiFi-DensePose stack already expose rich human-sensing telemetry — presence, person count, 17-keypoint pose, breathing rate (BR), heart rate (HR), motion level, fall detection, RSSI, and zone occupancy — over a Rust `wifi-densepose-sensing-server` (`v2/crates/wifi-densepose-sensing-server`). The server emits three structured message types over its WebSocket at `/ws/sensing`: + +| Server message `type` | Source (`main.rs`) | Payload (selected fields) | +|---|---|---| +| `pose_data` | line 2340 | 17 keypoints per detection, `confidence`, `track_id` | +| `edge_vitals` | line 3971 | `node_id`, `presence`, `fall_detected`, `motion`, `breathing_rate_bpm`, `heartrate_bpm`, `n_persons`, `motion_energy`, `presence_score`, `rssi` | +| `sensing_update` | lines 1903 / 2047 / 4098 / 4350 / 4481 | aggregated detections + zone hits | + +Customers running a **Cognitum Seed** appliance (`cognitum-v0` at `:9000`) or a standalone **ESP32-S3** / **ESP32-C6** node (per ADR-110) want this telemetry inside **Home Assistant (HA)** — the most widely deployed open-source home-automation hub (>500 k installs, OSS, MQTT-native) — so they can build automations around presence, vitals, falls, and motion without writing code against our REST/WebSocket API. + +### 1.1 Why this matters now + +Two recent customer-facing issues show the same plug-and-play gap: + +- **#574 (mDNS for seed_url)** — users don't want to manually paste a `seed://` URL into the dashboard; they expect the hub to discover the node. +- **#760 (sensing UI)** — users asked for an HA-style "single dashboard with all my sensors" experience; we currently force them through our own UI. + +Both reduce to the same underlying complaint: *RuView is a black box that needs glue code to fit into the rest of a smart home.* HA solves that problem industry-wide. We should meet users where they already are. + +### 1.2 Comparison: who else does this + +| Product | HA approach | Notes | +|---|---|---| +| **espectre.dev** | Custom HA integration (HACS), Python | Pose-only; no vitals; closed-source server | +| **tommysense.com** | MQTT auto-discovery + cloud bridge | Vitals only; cloud-mandatory | +| **Aqara FP2** | Native ZigBee + HA | Presence + zones only; commercial mmWave | +| **mmWave HLK-LD2410** | ESPHome firmware → HA | Presence + distance, no pose, no vitals | +| **Matter devices (any)** | Native Matter clusters, multi-controller | Apple/Google/Alexa/HA all consume; presence in `OccupancySensing` since Matter 1.3; no vitals/pose clusters yet | +| **RuView (today)** | None | Customer must build their own bridge | + +The competitive bar is set by Aqara FP2 (HA-native, multi-zone presence) and ESPHome-flashed LD2410 nodes (cheap, plug-and-play). To match or exceed them we need first-class HA integration that exposes our **differentiated** capabilities: pose, HR/BR, fall, multi-room. + +### 1.3 What this ADR is *not* + +- Not a HACS Python integration today (that's a follow-on; see §6). +- Not a webhook-only push (one-way, no entity discovery). +- Not a change to the ADR-018 CSI frame format or ADR-039 edge vitals packet — purely an additive consumer of the existing WS broadcast. +- Not a change to firmware. Both ESP32-S3 (ADR-028) and ESP32-C6 (ADR-110) paths stay byte-identical. + +--- + +## 2. Decision + +Adopt a **dual-protocol** integration strategy: + +1. **Primary — MQTT + Home Assistant auto-discovery (HA-DISCO).** Add an MQTT publisher to `wifi-densepose-sensing-server` that connects to a user-supplied MQTT broker (default: `mqtt://localhost:1883`), publishes one HA-discovery message per capability per RuView node on startup and on periodic refresh (default 600 s), translates each WebSocket broadcast (`edge_vitals`, `pose_data`, `sensing_update`) into per-entity MQTT state messages, and honors a `--privacy-mode` flag that strips biometrics (HR / BR / pose keypoints) before publish. + +2. **Secondary — Matter Bridge (HA-FABRIC).** Expose RuView nodes as Matter Bridged Devices over WiFi so the **subset of capabilities Matter standardises today** — presence (`OccupancySensing`), motion (`BooleanState`), fall events (`SwitchCluster`-as-event), person count (numeric attribute on the bridge) — are consumable by **any Matter controller**: Apple Home, Google Home, Amazon Alexa, Samsung SmartThings, and Home Assistant itself. Biometrics (HR/BR) and pose stay on MQTT until the Matter spec adds device types that can represent them. + +The two paths are **complementary, not alternative**: MQTT carries the full telemetry surface for power users; Matter carries the standardised subset for cross-ecosystem reach. A user running HA gets both — MQTT entities populate alongside Matter Bridged Devices and HA dedupes via `unique_id`. A user running Apple Home gets only Matter, but they get the presence/fall/count signals that matter most for automations. + +A **Home Assistant HACS Python integration** is sketched as a follow-on (§6.A) for users who don't run MQTT and want richer features than Matter exposes. A **REST webhook** path is rejected (§6.B). + +### 2.1 Why this split (MQTT primary, Matter secondary) + +| Criterion | A. MQTT auto-discovery | **D. Matter Bridge** | B. HACS Python integration | C. REST webhook | +|---|---|---|---|---| +| **Zero-code UX for end user** | yes (HA picks up entities automatically) | yes (pair via QR code, any controller) | yes (after install) | no (user wires automations by hand) | +| **Cross-ecosystem reach** | HA + any MQTT consumer | **Apple / Google / Alexa / SmartThings / HA** | HA-only | HA-only | +| **Distribution + maintenance** | one Rust feature in our existing crate | one Rust feature + Matter SDK linkage | new Python repo, HACS approval | trivial | +| **Discovery (auto entity creation)** | yes (HA's `homeassistant/` topic namespace) | yes (Matter commissioning + bridge endpoints) | yes (config flow) | no | +| **Bidirectional control** | yes (subscribe to command topic) | yes (Matter commands) | yes | one-way only | +| **Carries vitals (HR/BR) / pose** | **yes** | **no — no Matter clusters exist** | yes (custom) | yes (custom) | +| **Carries presence / count / fall** | yes | **yes (Matter 1.3+)** | yes | yes | +| **Works without HA running** | any MQTT consumer | any Matter controller | HA-only | HA-only | +| **Existing infra in target homes** | most HA users already run a broker | one Matter controller per home (Apple HomePod / Nest Hub / HA-Matter add-on) | none | none | +| **Effort to MVP** | ~2 weeks | ~4–6 weeks (Matter SDK + commissioning) | ~4–6 weeks | ~2 days | +| **Privacy controls** | per-topic + retain policy | Matter fabric isolation + spec-level limits on what's exposable | application-layer | weak | +| **Certification cost** | none | "Works with HA" free; **CSA Matter certification optional** (~$3 k/year membership for the badge) | HACS review (free) | none | +| **Test surface in CI** | dockerised mosquitto + schema lint | matter-rs test harness + chip-tool sims | full HA test harness | curl | + +**MQTT is primary** because it carries 100% of RuView's differentiated telemetry (pose, HR, BR) which no other path can. **Matter is secondary** because it covers the ~30% subset (presence/count/fall) that matters across the *other 70% of smart-home buyers* who don't run HA. Together they cover the whole market. Webhook (C) gives up too much (no entity discovery, no control plane) and is rejected. HACS (B) is strictly more polished than MQTT but strictly more expensive; revisit after MQTT adoption data is in. + +--- + +## 3. Detailed Design + +### 3.1 Entity mapping + +Each RuView node becomes one HA **device**. Each capability becomes an **entity** on that device. ESP32 nodes behind a Cognitum Seed appliance are linked via HA's `via_device` field so the topology shows up in the HA UI. + +| Capability | HA component | `device_class` | `state_class` | Unit | Icon | Source field (server WS) | +|---|---|---|---|---|---|---| +| Presence | `binary_sensor` | `occupancy` | — | — | `mdi:motion-sensor` | `edge_vitals.presence` | +| Person count | `sensor` | — | `measurement` | persons | `mdi:account-group` | `edge_vitals.n_persons` | +| Breathing rate | `sensor` | — | `measurement` | bpm | `mdi:lungs` | `edge_vitals.breathing_rate_bpm` | +| Heart rate | `sensor` | — | `measurement` | bpm | `mdi:heart-pulse` | `edge_vitals.heartrate_bpm` | +| Motion level | `sensor` | — | `measurement` | % | `mdi:run` | `edge_vitals.motion` (0–1 → ×100) | +| Motion energy | `sensor` | — | `measurement` | (unitless) | `mdi:waveform` | `edge_vitals.motion_energy` | +| Fall detected | `event` | — | — | — | `mdi:human-fall` | `edge_vitals.fall_detected` | +| Presence score | `sensor` | — | `measurement` | % | `mdi:gauge` | `edge_vitals.presence_score` (×100) | +| RSSI | `sensor` | `signal_strength` | `measurement` | dBm | `mdi:wifi` | `edge_vitals.rssi` | +| Zone occupancy (per zone) | `binary_sensor` | `occupancy` | — | — | `mdi:map-marker` | `sensing_update.zones[*]` | +| Pose keypoints | `sensor` (JSON attr) | — | — | — | `mdi:human` | `pose_data.keypoints` (opt-in) | +| Tracked persons (per ID) | `binary_sensor` (dynamic) | `occupancy` | — | — | `mdi:account` | `pose_data.track_id` | + +Pose keypoints are intentionally not a first-class HA entity (HA has no 17-keypoint primitive); instead they're exposed as an attribute payload on a `wifi_densepose__pose` sensor, so power users can template against them but the default HA UI stays clean. + +### 3.2 MQTT topic structure + +We follow HA's documented `homeassistant////config` discovery convention. Object ID is `wifi_densepose_` to namespace cleanly against other devices. + +``` +homeassistant/binary_sensor/wifi_densepose_/presence/config (retained, QoS 1) +homeassistant/binary_sensor/wifi_densepose_/presence/state (not retained, QoS 0) +homeassistant/binary_sensor/wifi_densepose_/presence/availability (retained, QoS 1) + +homeassistant/sensor/wifi_densepose_/heart_rate/config (retained, QoS 1) +homeassistant/sensor/wifi_densepose_/heart_rate/state (not retained, QoS 0) + +homeassistant/sensor/wifi_densepose_/breathing_rate/config +homeassistant/sensor/wifi_densepose_/breathing_rate/state + +homeassistant/event/wifi_densepose_/fall/config (retained, QoS 1) +homeassistant/event/wifi_densepose_/fall/state (not retained, QoS 1) + +ruview//raw/pose (opt-in, not retained, QoS 0) +ruview//raw/sensing_update (opt-in, not retained, QoS 0) +``` + +The `ruview//raw/*` namespace is **outside** the `homeassistant/` discovery prefix on purpose: it carries the original WebSocket JSON for users who want to consume it directly (Node-RED, Grafana, custom scripts), without HA trying to interpret it as an entity. + +### 3.3 Example discovery payloads + +**Presence (binary_sensor):** + +```json +{ + "name": "Presence", + "unique_id": "wifi_densepose_aabbccddeeff_presence", + "object_id": "wifi_densepose_aabbccddeeff_presence", + "state_topic": "homeassistant/binary_sensor/wifi_densepose_aabbccddeeff/presence/state", + "availability_topic": "homeassistant/binary_sensor/wifi_densepose_aabbccddeeff/presence/availability", + "payload_on": "ON", + "payload_off": "OFF", + "payload_available": "online", + "payload_not_available": "offline", + "device_class": "occupancy", + "qos": 1, + "device": { + "identifiers": ["wifi_densepose_aabbccddeeff"], + "name": "RuView node aabbccddeeff", + "manufacturer": "ruvnet", + "model": "ESP32-S3 CSI node", + "sw_version": "v0.6.7", + "via_device": "cognitum_seed_1" + }, + "origin": { + "name": "wifi-densepose-sensing-server", + "sw_version": "0.7.0", + "support_url": "https://github.com/ruvnet/RuView" + } +} +``` + +**Heart rate (sensor):** + +```json +{ + "name": "Heart rate", + "unique_id": "wifi_densepose_aabbccddeeff_heart_rate", + "state_topic": "homeassistant/sensor/wifi_densepose_aabbccddeeff/heart_rate/state", + "availability_topic": "homeassistant/sensor/wifi_densepose_aabbccddeeff/heart_rate/availability", + "unit_of_measurement": "bpm", + "state_class": "measurement", + "icon": "mdi:heart-pulse", + "value_template": "{{ value_json.bpm }}", + "json_attributes_topic": "homeassistant/sensor/wifi_densepose_aabbccddeeff/heart_rate/state", + "qos": 0, + "device": { "identifiers": ["wifi_densepose_aabbccddeeff"] } +} +``` + +State payload published to `.../heart_rate/state`: + +```json +{ "bpm": 68.2, "confidence": 0.91, "ts": "2026-05-23T14:00:00Z" } +``` + +**Fall (event):** + +```json +{ + "name": "Fall detected", + "unique_id": "wifi_densepose_aabbccddeeff_fall", + "state_topic": "homeassistant/event/wifi_densepose_aabbccddeeff/fall/state", + "event_types": ["fall_detected"], + "icon": "mdi:human-fall", + "qos": 1, + "device": { "identifiers": ["wifi_densepose_aabbccddeeff"] } +} +``` + +State payload (fired once per fall, **not retained**): + +```json +{ "event_type": "fall_detected", "ts": "2026-05-23T14:00:00.123Z", "confidence": 0.87 } +``` + +### 3.4 Device-level grouping + +- One HA `device` per RuView **node** (ESP32-S3 / S3-Mini / C6, or the host running sensing-server in mock mode). +- `device.identifiers` = `["wifi_densepose_"]` where `node_id` is the MAC-derived ID already in `edge_vitals.node_id`. +- For nodes behind a **Cognitum Seed**, set `device.via_device = "cognitum_seed_"` so HA renders the topology as a tree (Seed → child nodes). +- The Cognitum Seed itself appears as a parent device with its own diagnostic entities (uptime, agent health) — published by the seed appliance directly, not by sensing-server. + +### 3.5 QoS, retention, and refresh + +| Topic | QoS | Retain | Refresh cadence | Rationale | +|---|---|---|---|---| +| `*/config` | 1 | **yes** | on startup + every 600 s | HA expects retained discovery; re-publishing periodically self-heals if HA restarts before our state messages arrive | +| `*/state` (sensor) | 0 | no | rate-limited per §3.7 | Best-effort; HA can tolerate occasional drops | +| `*/state` (binary_sensor) | 1 | **yes** | on change only | Last value matters; new HA subscribers should see current state | +| `*/state` (event) | 1 | no | on event | Falls must not be missed; never retained or HA replays old events | +| `*/availability` | 1 | **yes** | LWT + 30 s heartbeat | Offline detection | +| `ruview/*/raw/*` | 0 | no | as-emitted | Raw firehose; consumers opt in | + +### 3.6 Availability + Last Will and Testament (LWT) + +On connect, sensing-server sets an MQTT LWT on each entity's `availability` topic to `offline` (retained). On successful connect it publishes `online` (retained). A 30-second heartbeat re-publishes `online` so HA can detect zombie sessions. + +``` +LWT topic: homeassistant/binary_sensor/wifi_densepose_/presence/availability +LWT payload: offline +LWT QoS: 1 +LWT retain: true +``` + +### 3.7 Bandwidth control + rate limiting + +Pose keypoints at 10 fps × 17 keypoints × 3 floats ≈ 4–8 kbit/s per person — fine over LAN, but pathological if a user accidentally routes it to a metered cellular MQTT bridge. Defaults: + +| Entity type | Default rate | Configurable | Override flag | +|---|---|---|---| +| Presence (binary) | on change | yes | — | +| Person count | 1 Hz | yes | `--mqtt-rate-count=1` | +| BR / HR | 0.2 Hz (every 5 s) | yes | `--mqtt-rate-vitals=0.2` | +| Motion level | 1 Hz | yes | `--mqtt-rate-motion=1` | +| Fall events | on event | no (always immediate) | — | +| RSSI | 0.1 Hz | yes | `--mqtt-rate-rssi=0.1` | +| Pose keypoints | **off by default**, 1 Hz when on | yes | `--mqtt-publish-pose --mqtt-rate-pose=1` | +| Zones | on change | yes | — | + +### 3.8 Configuration UX — CLI + env + +New CLI flags on `wifi-densepose-sensing-server` (gated behind `--mqtt`): + +``` +--mqtt Enable MQTT publisher (default off) +--mqtt-host MQTT broker host (default: localhost) +--mqtt-port MQTT broker port (default: 1883, 8883 if --mqtt-tls) +--mqtt-username MQTT username +--mqtt-password-env Read password from env var (default: MQTT_PASSWORD) +--mqtt-client-id Client ID (default: wifi-densepose-) +--mqtt-prefix Discovery prefix (default: homeassistant) +--mqtt-tls Enable TLS (default off) +--mqtt-ca-file CA bundle (default: system trust) +--mqtt-client-cert Client cert for mTLS +--mqtt-client-key Client key for mTLS +--mqtt-refresh-secs Discovery refresh interval (default: 600) +--mqtt-rate-vitals Vitals publish rate (default: 0.2) +--mqtt-rate-motion Motion publish rate (default: 1.0) +--mqtt-rate-count Person count publish rate (default: 1.0) +--mqtt-rate-rssi RSSI publish rate (default: 0.1) +--mqtt-publish-pose Publish pose keypoints (default off) +--mqtt-rate-pose Pose publish rate when enabled (default: 1.0) +--privacy-mode Strip biometrics (HR/BR/pose) before publish +``` + +Env var equivalents follow `RUVIEW_MQTT_HOST`, `RUVIEW_MQTT_USERNAME`, etc., so Docker / systemd users don't have to wire long arg lists. Configuration is loaded in the order: CLI > env > defaults. + +### 3.9 TLS + auth + +- **Recommended**: mTLS on a dedicated VLAN with the broker pinned to a CA we issue per Cognitum Seed appliance. +- **Acceptable**: username + password over TLS to a public broker (e.g. user's existing Mosquitto add-on inside HA). +- **Rejected**: plaintext on any network shared with non-trusted devices. Sensing-server logs a `WARN` if `--mqtt` is enabled without `--mqtt-tls` and the broker is not `localhost`. + +### 3.10 Privacy mode + +`--privacy-mode` strips biometric + biometric-derivable channels before any MQTT publish, regardless of subscriber. Discovery messages for those entities are **never published** in this mode (HA never sees them exist). + +| Channel | Default | `--privacy-mode` | +|---|---|---| +| Presence | published | **published** | +| Person count | published | **published** | +| Motion level | published | **published** | +| Zone occupancy | published | **published** | +| RSSI | published | **published** | +| Breathing rate | published | **stripped** | +| Heart rate | published | **stripped** | +| Fall events | published | **published** (safety > privacy) | +| Pose keypoints | off by default | **stripped** (cannot be force-enabled) | + +This implements the ADR-106 primitive-isolation contract at the integration boundary: HR / BR / pose are biometric-class signals and must not leak to an unconstrained MQTT broker without explicit operator opt-in. + +### 3.11 Matter Bridge (HA-FABRIC) + +The Matter path runs **in the same `wifi-densepose-sensing-server` process** behind a `--matter` feature flag, gated independently of `--mqtt`. The bridge presents itself to Matter controllers as a **Bridged Devices Aggregator** (per Matter Core Spec §9.13) with one Bridged Device endpoint per RuView node, exposing the standardised subset of capabilities. Biometrics and pose are **not exposed** over Matter — they have no spec-defined clusters and cannot be soundly represented (covering them in `Generic Sensor` would force every controller to render them as nameless numbers). + +#### 3.11.1 Matter device-type mapping + +| RuView capability | Matter cluster | Endpoint device type | Source field | +|---|---|---|---| +| Presence | `OccupancySensing` (0x0406) | `OccupancySensor` (0x0107) | `edge_vitals.presence` | +| Motion (boolean above threshold) | `OccupancySensing` (0x0406) | (same endpoint) | `edge_vitals.motion > 0.1` | +| Fall event | `Switch` (0x003B) `MultiPressComplete` event | `GenericSwitch` (0x000F) | `edge_vitals.fall_detected` (one momentary press = one fall) | +| Person count | `OccupancySensing` extension attribute (vendor-specific 0xFFF1_0001) | (same endpoint) | `edge_vitals.n_persons` | +| Zone occupancy | one `OccupancySensor` endpoint per zone | (multiple endpoints) | `sensing_update.zones[*]` | +| RSSI / motion energy / presence score / breathing rate / heart rate / pose | **not exposed over Matter** | — | (MQTT only) | + +The vendor-specific person-count attribute uses RuView's CSA-assigned vendor ID (open question §9.9). Controllers that don't understand the vendor extension still see the standard `OccupancySensing.Occupancy` boolean — graceful degradation. + +#### 3.11.2 Commissioning + fabric model + +- **Commissioning over WiFi**: the bridge prints a Matter setup code (11-digit short code + QR string) to logs and to `--matter-setup-file ` on first start. User scans with Apple Home / Google Home / HA Matter integration. +- **No Thread radio required**: sensing-server runs on hosts (Pi 5, x86, Cognitum Seed) that have WiFi but no 802.15.4. Matter-over-WiFi is sufficient. Thread support is explicitly out of scope until ESP32-C6 firmware grows a Matter stack (separate ADR; see §7). +- **Multi-admin / multi-fabric**: the bridge accepts multiple commissioning sessions so a single node can be paired into Apple Home **and** Home Assistant **and** Google Home concurrently — Matter's `OperationalCredentials` cluster handles fabric isolation. +- **Resetting commissioning**: a `--matter-reset` CLI flag wipes stored fabric credentials so a node can be repaired against a new controller. + +#### 3.11.3 SDK choice (open in §9, sketched here) + +Three viable Rust paths: + +| Option | Pros | Cons | +|---|---|---| +| **`matter-rs`** (project-chip/rs-matter) — pure-Rust SDK | No FFI, no C++ build chain, fits our Rust-only crate policy, MIT-licensed | Less mature than C++ chip-tool; certification path less proven | +| **`project-chip/connectedhomeip`** via Rust FFI bindings | Reference implementation, every controller tested against it, certification-ready | Drags in CMake, C++ toolchain, ~50 MB of vendored code; clashes with our cargo-first build | +| **External Matter bridge process** (separate ESPHome-like daemon) | Decouples Rust crate from Matter SDK churn | Operational complexity; two processes to deploy | + +**Tentative**: `matter-rs` for v0.7.0 ship; fall back to chip-tool-FFI if cert blockers emerge. Final decision deferred to P7 spike. + +#### 3.11.4 Limitations to document upfront + +These are **deliberate**, not bugs — users must see them in `docs/integrations/matter.md` before pairing: + +- **No HR, BR, pose, RSSI over Matter.** Matter has no clusters for these. Use MQTT for biometric / detailed telemetry. +- **Fall events are one-shot.** A fall fires a momentary switch press; controllers must subscribe to the event (most do). +- **Person count is vendor-extension.** Apple Home / Google Home will show occupancy on/off; only HA and SmartThings (with custom handlers) will surface the count. +- **One fabric controller is "primary."** Automations split across fabrics can race; users should keep heavy automation logic in one controller (typically HA). +- **No video / image data ever.** Matter spec forbids it on these device types and we wouldn't expose it anyway. + +#### 3.11.5 Why this is "Works with HA" *and* "Works with everything else" + +A node paired into HA shows up in **two** ways: +- as a set of MQTT entities (HA-DISCO path) with full telemetry +- as a Matter device under HA's Matter integration with the standard subset + +HA dedupes by `unique_id` (we set both paths' IDs to `wifi_densepose__`), so users don't see ghost devices. The Matter device is the one Apple Home or Google Home will see if the user also pairs into those — same physical node, three controllers, no duplication. This is the architectural reason for adopting both protocols rather than picking one. + +### 3.12 Semantic automation primitives (HA-MIND) + +Raw signals are not the product. Customers don't want to *write a Node-RED flow that thresholds breathing rate at night to infer sleep*. They want a `binary_sensor.bedroom_someone_sleeping` they can wire directly into a "dim hallway light at 10 % if anyone's asleep" automation. Same for fall *risk*, distress, room activity, elderly inactivity, meeting-in-progress, bathroom occupancy. This is the inference layer that turns RuView from "RF sensing" into **ambient intelligence infrastructure** — and it has to ship as first-class HA entities and Matter events, not as a developer SDK. + +#### 3.12.1 Catalog of inferred primitives (v1) + +Each primitive is a fused state derived from one or more raw channels with a small finite-state machine. Inference runs inside `wifi-densepose-sensing-server` (same place MQTT publication runs), gated behind `--semantic` (default on; can be disabled). Each primitive has a confidence score and an explanation field so HA users can debug why it fired. + +| Primitive | Inputs (raw) | Output kind | Default true-condition | Hysteresis / refractory | +|---|---|---|---|---| +| **Someone sleeping** | presence + low motion (<5 % for ≥300 s) + breathing rate 8–20 bpm + low HR variability | `binary_sensor` (occupancy) | all conditions hold simultaneously | enters after 5 min; exits when motion > 15 % for ≥30 s | +| **Possible distress** | sustained elevated HR (>1.5× rolling baseline for ≥60 s) + agitated motion + no fall | `binary_sensor` (problem) + `event` | confidence ≥ 0.75 | latch for 5 min after exit | +| **Room active** | presence + motion > 10 % for ≥30 s in any 5-min window | `binary_sensor` (occupancy) | window-rolling | exits on 10 min idle | +| **Elderly inactivity anomaly** | no motion + presence stable for > N× rolling daily median idle (default 2×) | `binary_sensor` (problem) + `event` | model-personalised | per-resident baseline; alerts max 1×/day | +| **Meeting in progress** | person count ≥ 2 + sustained low-amplitude motion (sitting) + speech-band micro-motion if `speech_band` cog installed | `binary_sensor` (occupancy) | ≥2 ppl + ≥10 min | exits when person count < 2 for 2 min | +| **Bathroom occupied** | presence true in zone tagged `bathroom` | `binary_sensor` (occupancy) | zone+presence | privacy-mode keeps this enabled (it's not biometric) | +| **Fall risk elevated** | recent near-fall (sharp acceleration without confirmed fall) OR gait instability score > threshold | `sensor` (0–100) + `event` on threshold cross | model-derived | 24-hour window | +| **Bed exit (overnight)** | "someone sleeping" → presence transitions out of bed-tagged zone between 22:00–06:00 local | `event` | edge-triggered | one event per exit | +| **No movement (safety check)** | presence true + motion < 1 % for ≥ N minutes (default 30) | `binary_sensor` (problem) + `event` | duration threshold | clears on motion | +| **Multi-room transition** | track_id continuous across zones within 10 s | `event` (`who_went_from_to`) | edge-triggered | per-track event | + +Catalog v2 (deferred): "child playing", "pet vs human", "agitation gradient", "circadian phase". Owned by an ADR-1xx follow-on after the v1 primitives have field data. + +#### 3.12.2 Surface mapping across the three layers + +| Layer | How a semantic primitive shows up | +|---|---| +| **MQTT (HA-DISCO)** | New topic namespace `homeassistant/binary_sensor/wifi_densepose_//` and `homeassistant/event/wifi_densepose_//` — full discovery payloads including the explanation field as `json_attributes` | +| **Matter (HA-FABRIC)** | Standard cluster mappings: sleeping/active/meeting/bathroom → `OccupancySensing` (separate endpoints); distress/inactivity/no-movement/bed-exit/fall-risk-cross → `Switch.MultiPressComplete` events on dedicated `GenericSwitch` endpoints; fall-risk score → vendor-extension attribute on the bridge endpoint | +| **Home Assistant automations** | Ship 8 starter blueprints in P5: "Notify on possible distress", "Wake-up routine on bed exit", "Dim hallway on someone sleeping", "Alert on elderly inactivity anomaly", "Lights on for meeting in progress", "Bathroom fan on while occupied", "Escalate on fall risk crossing 70", "Auto-arm security when room not active" | +| **Apple Home scenes** | Each `OccupancySensor` endpoint and each `GenericSwitch` event triggers Apple Home scenes via Matter — user picks "When *bedroom someone sleeping* is on, run *night mode*" from the Apple Home UI directly. No HA required for this path | + +#### 3.12.3 Why these specific primitives + +These eight cover the **top automation requests from the smart-home market** without needing video or wearables: + +- **Healthcare / aging-in-place** — "elderly inactivity anomaly", "fall risk elevated", "possible distress", "no movement (safety check)", "bed exit (overnight)" — directly map to AAL (Active and Assisted Living) device-class expectations +- **Convenience automation** — "someone sleeping", "room active", "meeting in progress", "bathroom occupied" — the four highest-volume HA forum-requested binary states +- **Privacy** — none of these require biometric *values* to be published, only the inferred *states*. A `--privacy-mode` deployment can keep semantic primitives ON and still strip HR/BR/pose, because the inference happens server-side and only the state crosses the wire + +#### 3.12.4 Inference quality contract + +Each primitive ships with: +- A **published precision/recall** on a held-out test set built from ADR-079 paired captures + synthetic stress scenarios — committed to `docs/integrations/semantic-primitives-metrics.md` +- An **explainability payload**: every state change carries `reason: ["motion<5%", "br=12bpm", "presence=true"]` style attributes so HA users can debug +- A **confidence threshold**: per-primitive, user-tuneable via `--semantic-threshold-=` (default published in the metrics doc) +- A **suppression contract**: primitives never fire during the first 60 s after sensing-server start (warmup), and never during `csi_calibration_in_progress` states (per ADR-014) + +#### 3.12.5 Configuration + +``` +--semantic Enable inference layer (default: on) +--semantic-thresholds-file Per-primitive thresholds (defaults shipped) +--semantic-zones-file Zone-tag map (e.g. {"bathroom": ["zone_3"]}) +--semantic-baseline-window-days Days of history for personalised baselines (default: 14) +--no-semantic- Disable a specific primitive (repeatable) +``` + +#### 3.12.6 What this changes architecturally + +Inference lives in a new module `semantic_inference.rs` alongside `mqtt_publisher.rs` and `matter_bridge.rs`. It subscribes to the same `tokio::broadcast` channel everything else does, runs each primitive's FSM, and emits **two output streams**: + +1. A `SemanticState` event on a new broadcast channel that MQTT and Matter publishers both subscribe to (so the same inference drives both surfaces without duplication) +2. Append-only `semantic_events.jsonl` log under `--data-dir` for offline analysis + ADR-079 paired-capture supervision + +This means: **adding a new primitive is one file change**. No MQTT schema rev, no Matter cluster rev — just add the FSM, register it, and discovery/state publish flow through both surfaces automatically. + +--- + +## 4. Implementation phases + +| Phase | Scope | Status | +|---|---|---| +| **P1** | Add `mqtt` feature flag to `wifi-densepose-sensing-server` Cargo.toml (depends on `rumqttc = "0.24"`). Wire CLI flags (§3.8) into `cli.rs`. No publishing yet, just config plumbing + unit tests on flag parsing. | pending | +| **P2** | HA discovery message emitter. New module `mqtt_discovery.rs`. Emits all entity `config` topics on connect + every `--mqtt-refresh-secs`. Schema-validated against HA's published JSON schema. | pending | +| **P3** | State publication. Subscribe to internal `tokio::broadcast` channel (the one `tx.send(json)` writes to on line 3983 of `main.rs`). Translate `edge_vitals` / `sensing_update` / `pose_data` messages into per-entity state payloads. Apply rate-limit + privacy-mode filters. | pending | +| **P4** | Integration tests: dockerised mosquitto in CI (extend `.github/workflows/firmware-qemu.yml` pattern), schema-validate every emitted config against HA's `homeassistant/components/mqtt` JSON schemas (pin to a tested HA version). Add a smoke test that brings up sensing-server in `--source mock --mqtt`, subscribes with `paho-mqtt` test client, asserts on entity creation. | pending | +| **P4.5** | **Semantic inference layer (HA-MIND).** New module `semantic_inference.rs` implementing the 10 v1 primitives from §3.12. Output broadcast channel consumed by both MQTT publisher (P3) and Matter bridge (P8). Per-primitive precision/recall baselines published to `docs/integrations/semantic-primitives-metrics.md`. Unit tests per FSM + integration tests via replay of ADR-079 paired captures. | pending | +| **P5** | Docs: new `docs/integrations/home-assistant.md` with screenshots of the HA UI after auto-discovery completes, example HA dashboard YAML (Lovelace card configs), 8 starter blueprints from §3.12.2 (distress notify, wake routine, hallway dim, elderly anomaly alert, meeting lights, bathroom fan, fall-risk escalate, auto-arm security), and the raw-channel example automations: "turn on hall light when presence ON", "send notification on fall_detected event", "log HR/BR to InfluxDB". | pending | +| **P6** | Ship `--mqtt` in the next sensing-server release (target: v0.7.0). Demo end-to-end on `cognitum-v0` against a Mosquitto add-on running on a Home Assistant OS install. Update README hardware-options table with "Works with Home Assistant" badge. | pending | +| **P7** | Matter Bridge spike: build a throwaway prototype with `matter-rs` exposing one `OccupancySensor` endpoint + one `GenericSwitch` for fall. Pair against Apple Home, Google Home, and HA's Matter integration. Decision gate: if pairing works on all three, proceed to P8; if blocked, switch to chip-tool FFI and re-spike. | pending | +| **P8** | Matter Bridge production. Implement `--matter`, `--matter-setup-file`, `--matter-reset`, `--matter-vendor-id`, `--matter-product-id` CLI flags. Aggregator + Bridged Devices for all RuView nodes; per-zone occupancy endpoints; fall as `MultiPressComplete` event; person count as vendor-extension attribute. Integration tests via chip-tool sim. | pending | +| **P9** | Multi-controller validation. Pair one Cognitum Seed + 3 child ESP32 nodes simultaneously into HA, Apple Home, and Google Home. Verify presence flips on all three within 1 s of a real motion change. Document the multi-admin flow in `docs/integrations/matter.md`. | pending | +| **P10** | CSA Matter certification path (optional, ADR-1xx follow-up). Decide cost vs marketing value of the official "Matter-certified" badge ($3 k/year CSA membership + per-product test fees). Sketch only — production decision deferred. | pending | + +Each phase ends with a checkbox PR. The ADR is updated with actual artifacts (commit hashes, screenshots, witness bundle entries) as phases land. **P1–P6 (MQTT) and P7–P10 (Matter) run in parallel after P6 lands** — they share no code, so a Matter regression cannot break the MQTT path and vice versa. + +--- + +## 5. Consequences + +### 5.1 Wins + +- Zero-code UX for HA users — discovery handles the entire onboarding. +- **Cross-ecosystem reach via Matter** — Apple Home / Google Home / Alexa / SmartThings users can adopt RuView without ever running HA, expanding our addressable market by ~4×. +- Decouples RuView from its own UI; users can build their own dashboards in HA / Grafana / Node-RED on the same MQTT firehose. +- Adds a `--privacy-mode` flag that gives operators a single-knob biometric strip for compliance contexts. +- Matter fabric isolation is a privacy win by construction — biometrics are out-of-spec for the exposed clusters, so a buggy controller can't accidentally exfiltrate them. +- Webhook + future HACS path stay open (§6) — no lock-in. +- Establishes our presence in the HA ecosystem AND the broader Matter ecosystem (community add-on lists, blueprints, forum recipes, App Store / Play Store visibility via Apple Home / Google Home device listings). + +### 5.2 Costs + +- New runtime dependency (`rumqttc`) in `wifi-densepose-sensing-server`. Mitigated by feature-flag (`mqtt`), default off; users who don't enable `--mqtt` pay zero binary or runtime cost. +- **Matter SDK dependency** (`matter-rs` tentatively) gated behind `--matter` feature flag. Adds ~5 MB to release binary when enabled; zero cost when disabled. Tracking CSA spec churn is a real ongoing cost. +- One more thing to maintain across HA breaking changes. HA commits to the `homeassistant//.../config` schema being stable (their published policy), but historically they have evolved fields like `availability_topic` → `availability` (list-of). We'll pin to a tested HA version per release and call out tested-against in `docs/integrations/home-assistant.md`. +- **Matter spec churn** — Matter 1.0 → 1.3 added device types and changed cluster IDs. We pin to a tested Matter spec version per release. Annual re-validation overhead. +- Requires CI infra: a mosquitto container in workflow, schema-validation against HA schemas, **and** a chip-tool simulator for Matter pairing tests (need to vendor or fetch). +- CSA membership ($3 k/year) is required to obtain a permanent vendor ID; until then we use the development VID `0xFFF1`. Production deployment past P9 requires the membership decision (§9.9). + +### 5.3 Verification + +Acceptance criteria are §8. Beyond those, this ADR is "Accepted" once P6 ships and at least one external user has reported a working HA install via the public issue tracker. + +--- + +## 6. Alternatives considered + +### 6.A Custom HA integration (HACS) — *follow-on, not primary* + +Rough sketch: + +- Separate Python repo (proposed name: `ruvnet/hass-wifi-densepose`). +- Talks to sensing-server's existing WebSocket at `/ws/sensing` and REST at `/api/*`. +- Config-flow UI in HA: user enters server URL + bearer token; integration discovers entities. +- Distribution via HACS (https://hacs.xyz), requires HACS review + acceptance. + +**Effort estimate:** ~4–6 weeks (vs ~2 weeks for §2 MQTT path). Adds a Python codebase to maintain in a Rust-first org. Pays off in two scenarios: + +1. Users who run HA but don't run an MQTT broker (rare but exists). +2. Users who want sensing-server features that don't map cleanly to MQTT (e.g. live pose video preview). + +**Plan:** revisit after P6 lands and we have real adoption data on the MQTT path. If MQTT covers 80%+ of installs, HACS becomes a nice-to-have. If not, it becomes ADR-1xx follow-up. + +### 6.B Local-push REST webhook — *rejected* + +- sensing-server `POST`s to HA's webhook endpoint (`/api/webhook/`). +- Trivial to implement (~2 days). + +Rejected because: + +- One-way only — no `set_state` / arm / disarm path back. +- No entity discovery — user has to manually create input_booleans / sensors / template_sensors in HA YAML. +- No availability / LWT — sensing-server going offline is invisible to HA. +- Fails the "plug-and-play" bar that #574 / #760 set. + +Documented here so future readers know we considered it. + +### 6.C mDNS discovery (#574) — *complementary, not competing* + +mDNS / Zeroconf lets HA (or any local client) discover sensing-server's IP without manual configuration. It's orthogonal to MQTT: we should add it (already tracked in #574) so the user doesn't have to type the broker host either. mDNS resolves *where the broker is*; MQTT auto-discovery resolves *what entities to create*. Both ship; neither blocks the other. + +--- + +## 7. Risks + +| Risk | Likelihood | Impact | Mitigation | +|---|---|---|---| +| Topic-namespace collision with another HA device | low | medium | `unique_id` includes `wifi_densepose_` prefix + MAC-derived node_id; HA will refuse duplicates and log clearly | +| HA changes the `homeassistant/` schema | medium (1× every ~2 years historically) | medium | Pin tested HA version in `docs/integrations/home-assistant.md`; CI runs schema validation against the pinned version | +| Bandwidth blowup from pose keypoints | medium | low (LAN) / high (metered link) | Pose publishing is **off by default**; rate-limited when on; users hit a clear `WARN` if they enable pose without explicit rate cap | +| Privacy regression — biometrics leaked to a public broker | medium | high | `--privacy-mode` strips them at source; WARN if `--mqtt` enabled without `--mqtt-tls` on a non-localhost broker; never publish HR / BR / pose discovery in privacy mode | +| Cognitum Seed firmware footprint (if we ever push MQTT into the ESP32 path) | low | medium | Out of scope for this ADR — MQTT lives in sensing-server only. ESP32 keeps the lean UDP/WS path. If we later add MQTT to firmware, it's ADR-1xx with its own size budget per ADR-110 | +| Broker compromise (bad actor on the network gets read access to MQTT) | low | high | mTLS recommendation in §3.9; `--privacy-mode` for high-risk deployments | +| HA-side cardinality explosion from per-track-id binary_sensors | medium | low | Cap dynamic person entities at 10; old ones are removed via discovery `payload=""` (HA delete-entity convention) | +| **Matter SDK (`matter-rs`) immaturity blocks cert** | medium | medium | P7 spike validates pairing on three controllers before P8 production work; fall back to chip-tool FFI if blocked | +| **Matter spec adds vitals device types**, our vendor-extension attributes become non-standard | low (3+ years out) | low | Vendor-extension attributes are opt-in for controllers; migration to standard cluster IDs is a one-version bump when the spec lands | +| **Multi-fabric races** (HA, Apple, Google all see the same node and fire conflicting automations) | medium | medium | Document the multi-admin guidance in `docs/integrations/matter.md`: pick one primary controller for automations, others for visibility | +| **Apple Home / Google Home rendering misrepresents** RuView (e.g. shows generic "Sensor") | medium | low | Set rich `VendorName` / `ProductName` / `ProductLabel` in BasicInformation cluster; ship a Matter App icon (per CSA brand guidelines) once vendor ID is real | +| **CSA membership cost** ($3 k/y) is a recurring spend with uncertain ROI | low (decision deferred to P10) | medium | Ship using dev VID `0xFFF1` through P9; commit to membership only after adoption data justifies it | + +--- + +## 8. Acceptance criteria + +A reviewer can run all of the following without modifying source: + +```bash +# 1. Start sensing-server with mock source + MQTT +cargo run -p wifi-densepose-sensing-server -- \ + --source mock \ + --mqtt \ + --mqtt-host localhost \ + --mqtt-prefix homeassistant + +# 2. Observe discovery + state messages +mosquitto_sub -t 'homeassistant/#' -v +# Expected: discovery configs for presence, heart_rate, breathing_rate, motion, +# fall, person_count, rssi — one per entity per node — plus periodic state messages + +# 3. Run the full workspace test suite +cd v2 && cargo test --workspace --no-default-features +# Expected: 1,031+ tests passed, 0 failed (new mqtt tests included) + +# 4. Schema-validate discovery configs against HA's published schemas +cargo test -p wifi-densepose-sensing-server --features mqtt mqtt::discovery::schema +# Expected: green + +# 5. Privacy mode strips biometrics +cargo run -p wifi-densepose-sensing-server -- --source mock --mqtt --privacy-mode & +mosquitto_sub -t 'homeassistant/#' -v | tee /tmp/privacy.log +# Expected: NO heart_rate, breathing_rate, or pose entities in discovery +grep -E "(heart_rate|breathing_rate|pose)" /tmp/privacy.log +# Expected: empty (exit 1) + +# 6. HA auto-discovery end-to-end (manual, post-P5) +# - Add Mosquitto broker to a fresh HA OS install +# - Add MQTT integration in HA, point at broker +# - Start sensing-server with --mqtt +# - HA Settings → Devices → expect "RuView node " with all entities +# - Trigger mock presence change; presence entity flips ON / OFF live + +# 7. LWT / availability +# - Run sensing-server, observe `online` published +# - Kill sensing-server (-9), wait 30 s +# - Expect `offline` on every entity's availability topic + +# 8. Matter Bridge pairing (post-P7) +cargo run -p wifi-densepose-sensing-server -- \ + --source mock \ + --matter \ + --matter-setup-file /tmp/matter-qr.txt +# Expected: setup code + QR string printed; bridge advertises over mDNS + +# 9. Matter cross-controller test (post-P9; manual) +# - Pair the bridge into Apple Home (scan QR with iPhone) +# - Pair the same bridge into Home Assistant Matter integration (same QR) +# - Trigger mock presence change in sensing-server +# - Expected: occupancy entity flips ON in both controllers within 1 s + +# 10. Matter privacy invariant +mosquitto_sub -t 'homeassistant/sensor/+/heart_rate/state' -v & +chip-tool occupancysensing read occupancy 0xDEADBEEF 1 # Matter endpoint 1 +# Expected: MQTT still publishes HR (without --privacy-mode); Matter NEVER exposes HR cluster (no clusters exist for it) +``` + +All ten must pass before the ADR moves from Proposed → Accepted. Tests 1–7 cover MQTT (P1–P6); tests 8–10 cover Matter (P7–P9). Tests can be re-run incrementally as each phase lands. + +--- + +## 9. Resolved decisions (maintainer ACK 2026-05-23) + +All 13 questions resolved by maintainer @ruv on 2026-05-23. Status: **ACCEPTED**. + +**Decision principle (canonical):** preserve clean protocols, avoid firmware bloat, avoid fake semantics, ship MQTT first, validate Matter second. + +### 9.A MQTT path (P1–P6) + +1. **Broker.** ✅ **Mosquitto as default.** Mention EMQX and VerneMQ as advanced options in `docs/integrations/home-assistant.md`. +2. **Discovery prefix.** ✅ **Ship `homeassistant`** (HA's default). `--mqtt-prefix` remains overridable for users with custom HA setups. +3. **HACS repo name.** ✅ **`ruvnet/hass-wifi-densepose`** — wired into the `support_url` field of every discovery payload's `origin` block from P1. +4. **Sample blueprints.** ✅ **Ship 3 starter blueprints in P5.** Selected from §3.12.2 list — final three picked at P5 start, biased toward highest customer-pull primitives. +5. **TLS default.** ✅ **WARN now, hard-fail non-localhost plaintext in v0.8.0.** Sensing-server logs a `WARN` if `--mqtt` enabled without `--mqtt-tls` on a non-localhost broker. v0.8.0 promotes to hard fail (exit non-zero) once docs cover the CA setup path. +6. **`node_friendly_name`.** ✅ **NVS / config only.** No ADR-039 packet change. Sensing-server resolves the friendly name from local config and injects into MQTT/Matter device labels. +7. **Pose keypoint schema.** ✅ **COCO 17-keypoint order.** Index → joint name mapping documented in `docs/integrations/home-assistant.md` and re-exported as `wifi_densepose_core::pose::COCO17`. +8. **Multi-node aggregation.** ✅ **4 children + 1 parent via `via_device`.** Easier to debug; matches §3.4. + +### 9.B Matter path (P7–P10) + +9. **Matter vendor ID.** ✅ **Dev VID `0xFFF1` through P9.** CSA membership decision gate at P10 (deferred; sketched only). +10. **Matter SDK.** ✅ **Start with `matter-rs`.** Fall back to chip-tool FFI only if cert blockers emerge in P7 spike. +11. **Matter Thread.** ✅ **Future ADR.** ADR-115 stays WiFi-only on the server side. Thread support from ESP32-C6 firmware is a separate ADR after C6 stabilises (post-ADR-110 P8). +12. **Fall event mapping.** ✅ **`Switch.MultiPressComplete`.** Cleaner semantics for controllers; matches Apple Home / Google Home rendering expectations. +13. **Person count.** ✅ **Vendor extension.** Do not kludge into fake endpoints. Apple Home / Google Home will show `Occupancy: ON/OFF` only — that's honest. HA and SmartThings will surface the count via the vendor-extension attribute. + +### 9.C Open-after-9 (new questions raised post-ACK) + +Empty as of 2026-05-23. New questions discovered during implementation will be filed here, ACK'd by maintainer, and dated. + +--- + +## 10. References + +- Home Assistant MQTT integration docs: https://www.home-assistant.io/integrations/mqtt/ +- HA MQTT auto-discovery: https://www.home-assistant.io/integrations/mqtt/#mqtt-discovery +- HA discovery schemas (per-component): https://www.home-assistant.io/integrations/binary_sensor.mqtt/ , .../sensor.mqtt/ , .../event.mqtt/ +- HACS: https://hacs.xyz +- HA Blueprint format: https://www.home-assistant.io/docs/blueprint/schema/ +- `rumqttc` (chosen Rust MQTT client): https://docs.rs/rumqttc/ +- **Matter Core Spec 1.3** (CSA): https://csa-iot.org/all-solutions/matter/ +- **Matter Device Library** (cluster + device-type catalog): https://csa-iot.org/wp-content/uploads/2023/12/Matter-1.3-Device-Library-Specification.pdf +- **matter-rs** (pure-Rust Matter SDK): https://github.com/project-chip/rs-matter +- **project-chip/connectedhomeip** (reference C++ Matter SDK / chip-tool): https://github.com/project-chip/connectedhomeip +- **Home Assistant Matter integration**: https://www.home-assistant.io/integrations/matter/ +- **Apple Home Matter support**: https://support.apple.com/en-us/HT213267 +- **Google Home Matter support**: https://developers.home.google.com/matter +- **CSA membership / vendor ID program**: https://csa-iot.org/become-member/ +- **"Works with Home Assistant" certification**: https://partner.home-assistant.io/ +- RuView ADR-018 — CSI binary frame format +- RuView ADR-021 — ESP32 vitals (edge breathing/HR extraction) +- RuView ADR-028 — ESP32 capability audit +- RuView ADR-031 — RuView sensing-first RF mode +- RuView ADR-039 — Edge vitals packet (`0xC511_0002`) +- RuView ADR-079 — Camera ground-truth training (pose schema) +- RuView ADR-103 — `cog-person-count` (person count primitive) +- RuView ADR-106 — DP-SGD + primitive isolation (privacy contract) +- RuView ADR-110 — ESP32-C6 firmware extension +- RuView ADR-114 — `cog-quantum-vitals` +- Issue [#574](https://github.com/ruvnet/RuView/issues/574) — mDNS for seed_url (complementary) +- Issue [#760](https://github.com/ruvnet/RuView/issues/760) — Sensing UI / onboarding friction +- Issue [#761](https://github.com/ruvnet/RuView/issues/761) — Competitive scan (espectre.dev, tommysense.com) + +--- + +*ADR-115 is the integration story that turns RuView from "another sensing platform" into "drop-in upgrade for any HA install **and** any Matter-controller home." MQTT carries the rich, differentiated telemetry; Matter carries the standardised subset across every controller ecosystem. Numbers 111 and 112 remain reserved per the project ADR-numbering policy.* diff --git a/docs/adr/README.md b/docs/adr/README.md index 5df4e2d2..400cbdc1 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -50,6 +50,7 @@ Statuses: **Proposed** (under discussion), **Accepted** (approved and/or impleme | [ADR-040](ADR-040-wasm-programmable-sensing.md) | WASM Programmable Sensing (Tier 3) | Accepted | | [ADR-041](ADR-041-wasm-module-collection.md) | WASM Module Collection (65 edge modules) | Accepted (hardware-validated) | | [ADR-044](ADR-044-provisioning-tool-enhancements.md) | Provisioning Tool Enhancements | Proposed | +| [ADR-110](ADR-110-esp32-c6-firmware-extension.md) | ESP32-C6 firmware extension — Wi-Fi 6 / 802.15.4 / TWT / LP-core | Accepted, P1-P10 complete, firmware-side substrate closed at **[v0.7.0-esp32](https://github.com/ruvnet/RuView/releases/tag/v0.7.0-esp32)**. Companion docs: [`WITNESS-LOG-110`](../WITNESS-LOG-110.md) (13 §A0.x entries · 99.56 % cross-board RX · **104.1 µs smoothed sync stdev** · ≤100 µs target met), [`ADR-110-REVIEW-GUIDE`](../ADR-110-REVIEW-GUIDE.md) (one-page reviewer tour), [`ADR-110-BRANCH-STATE`](../ADR-110-BRANCH-STATE.md) (coordination map vs `feat/adr-115-ha-mqtt-matter`). Host decoders + tests: Python `SyncPacketParser` (10) + Rust `wifi_densepose_hardware::SyncPacket` (15), cross-language hex pin gates drift. | ### Signal processing and sensing diff --git a/docs/user-guide.md b/docs/user-guide.md index 5f6743fa..692b22a1 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -473,6 +473,72 @@ Base URL: `http://localhost:3000` (Docker) or `http://localhost:8080` (binary de | `POST` | `/api/v1/adaptive/train` | Train adaptive classifier from recordings | `{"success":true,"accuracy":0.85}` | | `GET` | `/api/v1/adaptive/status` | Adaptive model status and accuracy | `{"loaded":true,"accuracy":0.85}` | | `POST` | `/api/v1/adaptive/unload` | Unload adaptive model | `{"success":true}` | +| `GET` | `/api/v1/mesh` | ADR-110 fleet-wide mesh sync map ([iter 29](adr/ADR-110-esp32-c6-firmware-extension.md)) | `{"nodes":{"9":{...},"12":{...}},"total":2}` | +| `GET` | `/api/v1/nodes/:id/sync` | Single-node mesh sync snapshot (or 404) | `{"offset_us":1163565,"is_leader":false,...}` | +| `GET` | `/api/v1/mesh/metrics` | ADR-110 mesh state in Prometheus exposition format ([iter 36](adr/ADR-110-esp32-c6-firmware-extension.md)) | `wifi_densepose_mesh_offset_us{node="9"} 1163565\n…` | + +### Example: Get fleet mesh state (ADR-110) + +```bash +curl -s http://localhost:3000/api/v1/mesh | python -m json.tool +``` + +```json +{ + "nodes": { + "9": { + "offset_us": 1163565, + "is_leader": false, + "is_valid": true, + "smoothed": true, + "sequence": 20, + "csi_fps_ema": 10.0, + "csi_fps_samples": 47 + }, + "12": { + "offset_us": -7, + "is_leader": true, + "is_valid": true, + "smoothed": false, + "sequence": 20, + "csi_fps_ema": 10.0, + "csi_fps_samples": 51 + } + }, + "total": 2 +} +``` + +Empty `{"nodes": {}, "total": 0}` means no mesh peers reachable. +Nodes that haven't emitted a sync packet yet are omitted from the map. + +### Example: Get one node's sync state + +```bash +curl -s http://localhost:3000/api/v1/nodes/9/sync | python -m json.tool +``` + +200 → same `NodeSyncSnapshot` shape as inside `/api/v1/mesh` or the +WebSocket `sync` field. Field meanings are documented under +[Per-node mesh sync (ADR-110)](#per-node-mesh-sync-adr-110). + +404 (unknown node): +```json +{"error": "unknown_node", "node_id": 99} +``` + +404 (node exists but hasn't synced yet): +```json +{ + "error": "no_sync", + "node_id": 9, + "hint": "node hasn't emitted a sync packet yet (no mesh peer or not v0.6.9+)" +} +``` + +Useful for Home Assistant REST sensors, Prometheus exporters, +automation rule probes, and curl debugging — anywhere you want +one-shot mesh state without holding a WebSocket connection. ### Example: Get Vital Signs @@ -564,6 +630,67 @@ ws.onerror = (err) => console.error("WebSocket error:", err); wscat -c ws://localhost:3001/ws/sensing ``` +### Per-node mesh sync (ADR-110) + +Since firmware **v0.7.0-esp32** + sensing-server iter 23, every +`sensing_update` whose nodes participate in the [ADR-110](adr/ADR-110-esp32-c6-firmware-extension.md) +ESP-NOW mesh carries an optional `sync` object per node: + +```json +{ + "type": "sensing_update", + "nodes": [ + { + "node_id": 9, + "rssi_dbm": -38.0, + "amplitude": [...], + "subcarrier_count": 64, + "sync": { + "offset_us": 1163565, + "is_leader": false, + "is_valid": true, + "smoothed": true, + "sequence": 20, + "csi_fps_ema": 10.0, + "csi_fps_samples": 47 + } + } + ] +} +``` + +Field meanings: + +| Field | Type | Meaning | +|---|---|---| +| `offset_us` | i64 | Smoothed local-vs-mesh clock offset in microseconds. Negative when this node is behind the leader. §A0.10 on the bench measured ~1.16 s boot delta between two C6 boards. | +| `is_leader` | bool | True when this node is the elected mesh leader (lowest EUI-64 in the cohort). | +| `is_valid` | bool | True when this node has heard a fresh leader beacon within the firmware's `VALID_WINDOW_MS = 3 s` freshness gate. | +| `smoothed` | bool | True once the firmware-side EMA filter has seeded (after ~8 beacons ≈ 0.8 s of follower mode). | +| `sequence` | u32 | High-water CSI sequence number stamped when this sync packet was emitted. Pair with the per-frame `sequence` field on incoming CSI to interpolate a mesh-aligned timestamp for any frame. | +| `csi_fps_ema` | f64 | Per-node EMA of the observed CSI frame rate. Bench typical ≈ 10 Hz. | +| `csi_fps_samples` | u32 | How many inter-frame deltas the EMA has seen. Treat values < 5 as "not yet trustworthy" and fall back to 20 Hz. | +| `staleness_ms` | u64 (optional) | Milliseconds since the host last received a sync packet from this node ([iter 34](adr/ADR-110-esp32-c6-firmware-extension.md)). Fade UI badges after 5 000 ms; treat ≥ 9 000 ms as the same condition that the firmware's `c6_sync_espnow_is_valid()` reports as `false`. | + +**When `sync` is omitted entirely**: the node isn't on the mesh (or +hasn't heard a peer yet). Non-ESP32 paths — multi-BSSID router scan, +synthetic-RSSI fallback, simulation — also omit `sync`. Existing +pre-iter-23 UI clients ignore the new field naturally because they +don't read it. + +**How to render this in a UI**: +- `is_leader === true` → badge the node "Leader" +- `is_valid === false` → grey out / "Sync lost" +- `csi_fps_samples < 5` → label as "Calibrating" until ≥5 frames +- `|offset_us|` trend → render a jitter histogram to show the §A0.10 + EMA suppression working live + +**How to recover a mesh-aligned timestamp for any CSI frame from this +node**: take the frame's own `sequence` u32, subtract `sync.sequence`, +divide by `sync.csi_fps_ema` (or 20.0 if `csi_fps_samples < 5`), +multiply by 1 000 000 µs — that's the mesh delta from the sync emit +time. Use it to align multistatic frames from sibling boards. + --- ## Web UI @@ -1094,6 +1221,15 @@ An RVF file contains: model weights, HNSW vector index, quantization codebooks, ## Hardware Setup +### Supported targets + +| Target | Use case | Source target flag | Notes | +|---|---|---|---| +| **ESP32-S3** (default) | Production CSI mesh, 17-keypoint pose | `idf.py set-target esp32s3` | Dual-core 240 MHz, PSRAM, native USB-OTG, DVP camera path | +| **ESP32-C6** ([ADR-110](adr/ADR-110-esp32-c6-firmware-extension.md)) | Wi-Fi 6 / 802.15.4 research, battery seed nodes | `idf.py set-target esp32c6` | Single-core 160 MHz, no PSRAM, 802.11ax HE PHY, 802.15.4 (Thread/Zigbee), LP-core hibernation ~5 µA | + +The same `firmware/esp32-csi-node` source tree builds for both. ESP-IDF picks up `sdkconfig.defaults.esp32c6` automatically when the target is set to `esp32c6`; otherwise it uses `sdkconfig.defaults` (S3). All C6-only modules are `#ifdef`-gated, so the S3 build is byte-identical to today. + ### ESP32-S3 Mesh A 3-6 node ESP32-S3 mesh provides full CSI at 20 Hz. Total cost: ~$54 for a 3-node setup. @@ -1109,7 +1245,11 @@ Pre-built binaries are available at [Releases](https://github.com/ruvnet/RuView/ | Release | What It Includes | Tag | |---------|-----------------|-----| -| [v0.5.0](https://github.com/ruvnet/RuView/releases/tag/v0.5.0-esp32) | **Stable (recommended)** — mmWave sensor fusion (MR60BHA2/LD2410 auto-detect), 48-byte fused vitals, all v0.4.3.1 fixes | `v0.5.0-esp32` | +| [v0.7.0](https://github.com/ruvnet/RuView/releases/tag/v0.7.0-esp32) | **Latest — ADR-110 firmware-side substrate closed.** Adds ESP-NOW mesh substrate with quantified ≤100 µs alignment (104.1 µs smoothed stdev, 3.95× suppression, 99.56 % cross-board match measured live), 32-byte sync-packet UDP emission with operator-tunable cadence, ADR-018 byte 19 bit 4 wire-fix sourced from working ESP-NOW path, Python SyncPacketParser stub for host wiring ([WITNESS-LOG-110 §A0.7-§A0.13](WITNESS-LOG-110.md)) | `v0.7.0-esp32` | +| [v0.6.9](https://github.com/ruvnet/RuView/releases/tag/v0.6.9-esp32) | Sync-packet UDP emission, `CONFIG_C6_SYNC_EVERY_N_FRAMES` tunable cadence | `v0.6.9-esp32` | +| [v0.6.8](https://github.com/ruvnet/RuView/releases/tag/v0.6.8-esp32) | ESP-NOW EMA-smoothed cross-board offset (3.95× suppression, 104 µs stdev) | `v0.6.8-esp32` | +| [v0.6.7](https://github.com/ruvnet/RuView/releases/tag/v0.6.7-esp32) | Real LP-core motion-gate RISC-V program (B4 code path complete) + Wi-Fi 6 soft-AP with TWT Responder for two-board iTWT benches (B1/B2 unblock) | `v0.6.7-esp32` | +| [v0.5.0](https://github.com/ruvnet/RuView/releases/tag/v0.5.0-esp32) | **Stable (S3 mesh, recommended)** — mmWave sensor fusion (MR60BHA2/LD2410 auto-detect), 48-byte fused vitals, all v0.4.3.1 fixes | `v0.5.0-esp32` | | [v0.4.3.1](https://github.com/ruvnet/RuView/releases/tag/v0.4.3.1-esp32) | Fall detection fix ([#263](https://github.com/ruvnet/RuView/issues/263)), 4MB flash ([#265](https://github.com/ruvnet/RuView/issues/265)), watchdog fix ([#266](https://github.com/ruvnet/RuView/issues/266)) | `v0.4.3.1-esp32` | | [v0.4.1](https://github.com/ruvnet/RuView/releases/tag/v0.4.1-esp32) | CSI build fix, compile guard, AMOLED display, edge intelligence ([ADR-057](../docs/adr/ADR-057-firmware-csi-build-guard.md)) | `v0.4.1-esp32` | | [v0.3.0-alpha](https://github.com/ruvnet/RuView/releases/tag/v0.3.0-alpha-esp32) | Alpha — adds on-device edge intelligence (ADR-039) | `v0.3.0-alpha-esp32` | @@ -1125,7 +1265,7 @@ python -m esptool --chip esp32s3 --port COM7 --baud 460800 \ 0xf000 ota_data_initial.bin 0x20000 esp32-csi-node.bin ``` -**4MB flash boards** (e.g. ESP32-S3 SuperMini 4MB): download the 4MB binaries from the [v0.4.3 release](https://github.com/ruvnet/RuView/releases/tag/v0.4.3-esp32) and use `--flash-size 4MB`: +**4MB flash boards** (e.g. ESP32-S3 SuperMini 4MB): download `esp32-csi-node-s3-4mb.bin` + `partition-table-s3-4mb.bin` from the [v0.6.7 release](https://github.com/ruvnet/RuView/releases/tag/v0.6.7-esp32) (882 KB binary, 52 % partition slack) and use `--flash-size 4MB`: ```bash python -m esptool --chip esp32s3 --port COM7 --baud 460800 \ @@ -1155,6 +1295,96 @@ python firmware/esp32-csi-node/provision.py --port COM7 \ All nodes in a mesh must share the same 256-bit mesh key for HMAC-SHA256 beacon authentication. The key is stored in ESP32 NVS flash and zeroed on firmware erase. +### ESP32-C6 (Wi-Fi 6 + 802.15.4 research target — ADR-110) + +The C6 build adds four capabilities to the existing csi-node firmware, all opt-in via `idf.py menuconfig → ESP32-C6 capabilities (ADR-110)`: + +| Capability | Kconfig | What it does | +|---|---|---| +| **Wi-Fi 6 HE-LTF tagging** | `CSI_FRAME_HE_TAGGING` (default on) | Each ADR-018 frame's previously-reserved bytes 18-19 now carry PPDU type (HT / HE-SU / HE-MU / HE-TB) + bandwidth flags. Magic stays `0xC5110001` — old aggregators see zeros and ignore. | +| **802.15.4 mesh time-sync** | `C6_TIMESYNC_ENABLE` (default on, channel 15) | Beacon-based cross-node clock alignment over the 802.15.4 radio. Frees the WiFi channel from coordination traffic — solves the ADR-029/030 multistatic clock-sync problem. | +| **TWT (Target Wake Time)** | `C6_TWT_ENABLE` (default on, 10 ms wake interval) | After WiFi connect, negotiates an individual TWT agreement with the AP for deterministic CSI cadence. Graceful NACK fallback if the AP doesn't support 11ax TWT. | +| **LP-core wake-on-motion hibernation** | `C6_LP_CORE_ENABLE` (default off) | Always-on motion gate on the LP RISC-V core; HP core stays in deep sleep until the configured GPIO wakes it. Targets ~5 µA for battery-powered Cognitum Seed nodes. | + +**Build + flash:** + +```bash +cd firmware/esp32-csi-node +idf.py set-target esp32c6 +idf.py build # ~1.0 MB binary, 46% partition slack on 4 MB flash +idf.py -p COM6 flash +# Then provision the same way as S3 (provision.py works for both targets): +python provision.py --port COM6 --ssid "YourWiFi" --password "secret" --target-ip 192.168.1.20 +``` + +**Verifying the C6 modules came up** — `idf.py -p COM6 monitor` should show: + +``` +I (353) main: ESP32-C6 CSI Node (ADR-018 / ADR-110) — v0.6.7 — Node ID: 1 +I (413) c6_ts: init done: channel=15 EUI= leader=yes(candidate) +I (463) wifi: mac_version:HAL_MAC_ESP32AX_761 ← 802.11ax MAC firmware loaded +``` + +The `c6_ts: init done` line confirms the 802.15.4 stack is up; if TWT succeeds you'll also see an `iTWT setup event received from AP` line after the WiFi connect completes. + +**Multi-room time-aligned multistatic capture (preview):** + +Flash two or more C6 boards, leave them on the same 802.15.4 channel (default 15). One will elect itself leader (lowest EUI-64) and broadcast `TS_BEACON` frames every 100 ms; the others compute and apply offsets. Each CSI frame from a follower carries a `c6_timesync_get_epoch_us()` wall-clock estimate aligned to within ±100 µs of the leader's monotonic time. Target use case: ADR-029/030 multistatic fusion without burning WiFi airtime on coordination. + +**Battery seed-node mode (v0.6.7 — real LP-core program):** + +```bash +# Enable LP-core hibernation in menuconfig: +# ESP32-C6 capabilities (ADR-110) → Enable LP-core wake-on-motion hibernation +# → LP-core wake GPIO (default 4 — connect a PIR or accelerometer INT line here) +# → LP-core poll period (default 10 ms) +# → LP-core debounce sample count (default 3 consecutive matches) +idf.py menuconfig +idf.py build flash +``` + +When enabled, the C6 LP RISC-V coprocessor runs a real polling program +(`firmware/esp32-csi-node/main/lp_core/main.c`) that polls the wake GPIO at +the configured cadence, debounces N consecutive matching reads, and wakes the +HP core via `ulp_lp_core_wakeup_main_processor()`. `esp_sleep_get_wakeup_cause()` +returns `ESP_SLEEP_WAKEUP_ULP`, and `c6_lp_core_motion_count()` / +`c6_lp_core_poll_count()` expose the LP-side counters for the witness harness. +Target standby current ~5 µA (datasheet; pending INA measurement). + +**Two-board iTWT bench (v0.6.7 — soft-AP HE/TWT, no router required):** + +Pair two C6 boards — one acts as the iTWT-capable AP, the other as the STA +that negotiates and benchmarks the TWT agreement. + +```bash +# Board #1 (AP role): append to sdkconfig.defaults.esp32c6: +CONFIG_C6_SOFTAP_HE_ENABLE=y +CONFIG_C6_SOFTAP_HE_SSID="ruview-c6-twt" +CONFIG_C6_SOFTAP_HE_PSK="ruviewtwt" +CONFIG_C6_SOFTAP_HE_CHANNEL=6 + +idf.py set-target esp32c6 && idf.py build && idf.py -p COM6 flash +``` + +Board #1 boots in `WIFI_MODE_APSTA`, advertising HE capabilities and TWT +Responder=1 on channel 6. Board #2 provisions to associate with that SSID: + +```bash +python firmware/esp32-csi-node/provision.py --port COM9 \ + --ssid "ruview-c6-twt" --password "ruviewtwt" --target-ip 192.168.1.20 +``` + +Board #2 runs the existing `c6_twt_setup_default()` on connect and now +negotiates a real iTWT agreement against the cooperative AP — the +`iTWT setup queued: wake_interval=10000 µs` log line should be followed by an +`iTWT setup event received from AP` instead of the `INVALID_ARG` graceful +fallback that fired against the bench's 11n-only `ruv.net` AP. + +NVS overrides for AP role (namespace `ruview`): `softap_ssid`, `softap_psk`, +`softap_chan` — provision once and the values survive firmware updates. + +**What's NOT on the C6 build** (vs S3 production): no AMOLED display (ADR-045 needs 8 MB + LCD touch driver), no WASM3 (ADR-040 needs PSRAM), no Seeed mmWave fusion (separate board). The C6 is a research/seed target, not a drop-in replacement for the S3 production node. + **TDM slot assignment:** Each node in a multistatic mesh needs a unique TDM slot ID (0-based): diff --git a/firmware/esp32-csi-node/README.md b/firmware/esp32-csi-node/README.md index 147d3602..f75d053c 100644 --- a/firmware/esp32-csi-node/README.md +++ b/firmware/esp32-csi-node/README.md @@ -1,11 +1,11 @@ -# ESP32-S3 CSI Node Firmware +# ESP32 CSI Node Firmware **Turn a $7 microcontroller into a privacy-first human sensing node.** -This firmware captures WiFi Channel State Information (CSI) from an ESP32-S3 and transforms it into real-time presence detection, vital sign monitoring, and programmable sensing -- all without cameras or wearables. Part of the [WiFi-DensePose](../../README.md) project. +This firmware captures WiFi Channel State Information (CSI) from an ESP32-S3 (production) or ESP32-C6 (research target — Wi-Fi 6 / 802.15.4 / TWT / LP-core hibernation, see [ADR-110](../../docs/adr/ADR-110-esp32-c6-firmware-extension.md)) and transforms it into real-time presence detection, vital sign monitoring, and programmable sensing -- all without cameras or wearables. Part of the [WiFi-DensePose](../../README.md) project. [![ESP-IDF v5.2](https://img.shields.io/badge/ESP--IDF-v5.2-blue.svg)](https://docs.espressif.com/projects/esp-idf/en/v5.2/) -[![Target: ESP32-S3](https://img.shields.io/badge/target-ESP32--S3-purple.svg)](https://www.espressif.com/en/products/socs/esp32-s3) +[![Target: ESP32-S3 / ESP32-C6](https://img.shields.io/badge/target-ESP32--S3%20%7C%20ESP32--C6-purple.svg)](https://www.espressif.com/en/products/socs/esp32-s3) [![License: MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-green.svg)](../../LICENSE) [![Binary: ~943 KB](https://img.shields.io/badge/binary-~943%20KB-orange.svg)](#memory-budget) [![CI: Docker Build](https://img.shields.io/badge/CI-Docker%20Build-brightgreen.svg)](../../.github/workflows/firmware-ci.yml) diff --git a/firmware/esp32-csi-node/main/CMakeLists.txt b/firmware/esp32-csi-node/main/CMakeLists.txt index 62d7d189..0cabf5df 100644 --- a/firmware/esp32-csi-node/main/CMakeLists.txt +++ b/firmware/esp32-csi-node/main/CMakeLists.txt @@ -9,6 +9,14 @@ set(SRCS "rv_feature_state.c" "rv_mesh.c" "adaptive_controller.c" + # ADR-110 — ESP32-C6 capability modules (no-op stubs on other targets via #ifdef) + "c6_twt.c" + "c6_timesync.c" + "c6_lp_core.c" + # ADR-110 D1 workaround — ESP-NOW cross-node sync (works on S3+C6) + "c6_sync_espnow.c" + # ADR-110 B1/B2 unblock — soft-AP HE/TWT (C6-only when enabled) + "c6_softap_he.c" ) # ESP-IDF v6+: headers must resolve via explicit REQUIRES (no implicit deps). @@ -32,6 +40,13 @@ set(REQUIRES mbedtls ) +# ADR-110: C6-only components — pulled in when building for esp32c6. +# Note: CONFIG_* symbols are not available in main CMakeLists.txt evaluation — +# we use the IDF_TARGET variable that idf.py sets from sdkconfig.defaults / set-target. +if(IDF_TARGET STREQUAL "esp32c6") + list(APPEND REQUIRES ieee802154 ulp esp_hw_support) +endif() + # ADR-061: Mock CSI generator for QEMU testing + ADR-081 mock radio binding if(CONFIG_CSI_MOCK_ENABLED) list(APPEND SRCS "mock_csi.c" "rv_radio_ops_mock.c") @@ -52,3 +67,15 @@ idf_component_register( INCLUDE_DIRS "." REQUIRES ${REQUIRES} ) + +# ADR-110 P5 (full): embed the LP-core motion-gate program when enabled. +# `ulp_embed_binary` compiles lp_core/main.c with the RISC-V LP toolchain +# and links the resulting binary into the HP image, exposing shared symbols +# via the auto-generated `ulp_main.h` header. +if(IDF_TARGET STREQUAL "esp32c6" AND CONFIG_C6_LP_CORE_ENABLE) + set(ulp_app_name ulp_main) + set(ulp_sources "lp_core/main.c") + # Source files in the HP component that include the generated ulp_main.h + set(ulp_exp_dep_srcs "c6_lp_core.c") + ulp_embed_binary(${ulp_app_name} "${ulp_sources}" "${ulp_exp_dep_srcs}") +endif() diff --git a/firmware/esp32-csi-node/main/Kconfig.projbuild b/firmware/esp32-csi-node/main/Kconfig.projbuild index 4e5895bb..18c32ebf 100644 --- a/firmware/esp32-csi-node/main/Kconfig.projbuild +++ b/firmware/esp32-csi-node/main/Kconfig.projbuild @@ -287,6 +287,151 @@ menu "WASM Programmable Sensing (ADR-040)" endmenu +menu "ESP32-C6 capabilities (ADR-110)" + depends on IDF_TARGET_ESP32C6 + + config C6_TWT_ENABLE + bool "Enable TWT (Target Wake Time) negotiation" + default y + # SOC_WIFI_HE_SUPPORT is auto-set on chips with HE (Wi-Fi 6) PHY (C6/C5) + depends on SOC_WIFI_HE_SUPPORT + help + After WiFi STA connect, request an individual TWT agreement + with the AP for deterministic CSI cadence. Falls back + gracefully if the AP doesn't support 11ax TWT. + + config C6_TWT_WAKE_INTERVAL_US + int "TWT wake interval (microseconds)" + default 10000 + range 1024 1048576 + depends on C6_TWT_ENABLE + help + Period between TWT wake events. 10000 µs = 100 Hz CSI cadence. + + config C6_TWT_MIN_WAKE_DURA_US + int "TWT minimum wake duration (microseconds)" + default 512 + range 256 16384 + depends on C6_TWT_ENABLE + help + Minimum awake duration per TWT wake. 512 µs is enough to + capture one CSI frame. + + config C6_TIMESYNC_ENABLE + bool "Enable 802.15.4 mesh time-sync" + default y + depends on IEEE802154_ENABLED + help + Cross-node clock alignment over the 802.15.4 radio. Frees + WiFi airtime from coordination traffic — relevant to + ADR-029/030 multistatic sensing. + + config C6_TIMESYNC_CHANNEL + int "802.15.4 time-sync channel (11-26)" + default 15 + range 11 26 + depends on C6_TIMESYNC_ENABLE + + config C6_LP_CORE_ENABLE + bool "Enable LP-core wake-on-motion hibernation" + default n + depends on ULP_COPROC_TYPE_LP_CORE + help + Arm the LP RISC-V coprocessor as an always-on motion gate + in deep sleep. Targets ~5 µA hibernation for battery + seed nodes. Requires a motion sensor on a wake-capable GPIO. + + config C6_LP_WAKE_GPIO + int "LP-core wake GPIO" + default 4 + range 0 23 + depends on C6_LP_CORE_ENABLE + + config C6_LP_WAKE_ACTIVE_HIGH + bool "Wake on rising edge" + default y + depends on C6_LP_CORE_ENABLE + + config C6_LP_POLL_PERIOD_US + int "LP-core poll period (microseconds)" + default 10000 + range 1000 1000000 + depends on C6_LP_CORE_ENABLE + help + How often the LP-core program reads the wake GPIO. + 10000 µs = 100 Hz. Lower values give faster response + but increase the average LP-core duty cycle (and + current). 10 ms is a good balance for PIR sensors. + + config C6_LP_DEBOUNCE_SAMPLES + int "LP-core debounce sample count" + default 3 + range 1 32 + depends on C6_LP_CORE_ENABLE + help + How many consecutive matching GPIO reads are required + before the LP-core wakes the HP core. 3 = ~30 ms at the + default 10 ms poll period. + + config C6_SOFTAP_HE_ENABLE + bool "Run as Wi-Fi 6 soft-AP with TWT Responder (two-board bench)" + default n + depends on SOC_WIFI_HE_SUPPORT + help + When set, the C6 starts in AP+STA mode and advertises a + soft-AP that announces HE (Wi-Fi 6) capability with + TWT Responder=1. Lets a second C6 station-mode board + negotiate a real iTWT agreement against a known-cooperative + AP, unblocking ADR-110 §B1/B2 measurement without + buying an 11ax router. SSID/PSK configured via NVS + (keys `softap_ssid` / `softap_psk`) or the defaults below. + + config C6_SOFTAP_HE_SSID + string "Soft-AP SSID (when C6_SOFTAP_HE_ENABLE)" + default "ruview-c6-twt" + depends on C6_SOFTAP_HE_ENABLE + + config C6_SOFTAP_HE_PSK + string "Soft-AP WPA2 password (>= 8 chars)" + default "ruviewtwt" + depends on C6_SOFTAP_HE_ENABLE + + config C6_SOFTAP_HE_CHANNEL + int "Soft-AP channel (1-13)" + default 6 + range 1 13 + depends on C6_SOFTAP_HE_ENABLE + + config C6_SYNC_EVERY_N_FRAMES + int "Sync-packet emission cadence (CSI frames per sync)" + default 20 + range 1 1000 + help + How many CSI callbacks fire before csi_collector emits one + ADR-110 §A0.11 sync packet (magic 0xC511A110) carrying the + mesh-aligned epoch + sequence high-water for the host + aggregator to pair against incoming CSI frames. + + Default 20 = ~2 s between sync packets at the bench's + observed 10 fps CSI rate. Raise for less wire overhead; + lower for tighter multistatic alignment windows. + +endmenu + +menu "ADR-018 frame extensions (ADR-110)" + + config CSI_FRAME_HE_TAGGING + bool "Tag ADR-018 frames with HE PPDU metadata" + default y + help + When the WiFi driver reports an 802.11ax HE-SU/HE-MU/HE-TB + PPDU, write the PPDU type + bandwidth into ADR-018 frame + bytes 18-19 (previously reserved). Readers that don't know + about this extension see the bytes as zero — fully + backwards compatible. + +endmenu + menu "Mock CSI (QEMU Testing)" config CSI_MOCK_ENABLED bool "Enable mock CSI generator (for QEMU testing)" diff --git a/firmware/esp32-csi-node/main/c6_lp_core.c b/firmware/esp32-csi-node/main/c6_lp_core.c new file mode 100644 index 00000000..d6e096ad --- /dev/null +++ b/firmware/esp32-csi-node/main/c6_lp_core.c @@ -0,0 +1,196 @@ +/** + * @file c6_lp_core.c + * @brief LP-core wake-on-motion hibernation — ADR-110 Phase 5 (full). + * + * Two operating modes, controlled by CONFIG_C6_LP_CORE_ENABLE: + * + * 1. ENABLED — real LP-core RISC-V program polls the wake GPIO at + * LP_TIMER cadence (default 10 ms), debounces N matching samples, + * and triggers an HP wake via `ulp_lp_core_wakeup_main_processor()`. + * HP enters deep sleep with `ESP_SLEEP_WAKEUP_ULP` as the source. + * Targets ~5 µA average current (datasheet figure for LP-core + + * RTC peripherals powered down). The LP binary is built by + * `ulp_embed_binary(...)` in main/CMakeLists.txt from lp_core/main.c. + * + * 2. DISABLED — falls back to plain deep-sleep + GPIO wake-up + * (`esp_deep_sleep_enable_gpio_wakeup`). No debounce, no + * sub-10 µA floor, but no LP toolchain dependency either. + * This is the path the v0.6.6 firmware shipped with. + * + * Both paths share `c6_lp_core_arm()` / `c6_lp_core_hibernate_and_wait()` + * so call sites in main.c don't change between modes. + */ + +#include "sdkconfig.h" + +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_ULP_COPROC_TYPE_LP_CORE) + +#include "c6_lp_core.h" +#include "esp_log.h" +#include "esp_sleep.h" +#include "driver/rtc_io.h" +#include "soc/soc_caps.h" +#include + +#if defined(CONFIG_C6_LP_CORE_ENABLE) +#include "ulp_lp_core.h" +/* ulp_main.h is auto-generated by `ulp_embed_binary(ulp_main, ...)` and + * exports every `volatile` global from lp_core/main.c with the `ulp_` + * prefix. Include is guarded so disabled builds don't try to find a + * file the build system hasn't generated. */ +#include "ulp_main.h" +extern const uint8_t ulp_main_bin_start[] asm("_binary_ulp_main_bin_start"); +extern const uint8_t ulp_main_bin_end[] asm("_binary_ulp_main_bin_end"); +#endif + +static const char *TAG = "c6_lp"; + +static int s_wake_gpio = -1; +static bool s_active_high = true; +static bool s_armed = false; + +#ifndef CONFIG_C6_LP_POLL_PERIOD_US +#define CONFIG_C6_LP_POLL_PERIOD_US 10000 /* 100 Hz default poll cadence */ +#endif + +#ifndef CONFIG_C6_LP_DEBOUNCE_SAMPLES +#define CONFIG_C6_LP_DEBOUNCE_SAMPLES 3 +#endif + +esp_err_t c6_lp_core_arm(int wake_gpio, bool active_high) +{ + if (wake_gpio < 0) { + ESP_LOGE(TAG, "invalid wake_gpio=%d", wake_gpio); + return ESP_ERR_INVALID_ARG; + } + s_wake_gpio = wake_gpio; + s_active_high = active_high; + + /* GPIO must be in the LP/RTC domain for either wake path. */ + esp_err_t ret = rtc_gpio_init(wake_gpio); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "rtc_gpio_init(%d) failed: %s", wake_gpio, esp_err_to_name(ret)); + return ret; + } + rtc_gpio_set_direction(wake_gpio, RTC_GPIO_MODE_INPUT_ONLY); + /* Floating inputs in deep sleep are an antenna — disable internal pulls + * only if the user has an external pull on the motion line; we leave + * default pulls so a disconnected pin doesn't toggle randomly. */ + +#if defined(CONFIG_C6_LP_CORE_ENABLE) + /* --- Real LP-core path --- */ + + /* On C6, LP-IO maps 1:1 to GPIO for indices 0..7. Validate. */ + if (wake_gpio > 7) { + ESP_LOGE(TAG, "LP-core path requires LP-IO 0..7, got GPIO %d", wake_gpio); + return ESP_ERR_INVALID_ARG; + } + + /* Load the LP-core binary blob. */ + esp_err_t err = ulp_lp_core_load_binary( + ulp_main_bin_start, + (size_t)(ulp_main_bin_end - ulp_main_bin_start)); + if (err != ESP_OK) { + ESP_LOGE(TAG, "ulp_lp_core_load_binary failed: %s", esp_err_to_name(err)); + return err; + } + + /* Hand the GPIO parameters to the LP program via shared symbols. + * These are declared `volatile` in lp_core/main.c so the HP write + * is observed by LP on the next iteration. */ + ulp_wake_gpio_num = (uint32_t)wake_gpio; + ulp_wake_active_high = active_high ? 1u : 0u; + ulp_debounce_samples = CONFIG_C6_LP_DEBOUNCE_SAMPLES; + ulp_motion_count = 0; + ulp_poll_count = 0; + ulp_last_gpio_level = 0; + + /* Configure LP-timer wakeup at the configured poll period and start the + * LP-core. `ulp_lp_core_run` is non-blocking; the LP core begins running + * the program immediately and the HP core can proceed to deep sleep. */ + ulp_lp_core_cfg_t cfg = { + .wakeup_source = ULP_LP_CORE_WAKEUP_SOURCE_LP_TIMER, + .lp_timer_sleep_duration_us = CONFIG_C6_LP_POLL_PERIOD_US, + }; + err = ulp_lp_core_run(&cfg); + if (err != ESP_OK) { + ESP_LOGE(TAG, "ulp_lp_core_run failed: %s", esp_err_to_name(err)); + return err; + } + + /* Tell deep-sleep that the LP-core is our wake source. */ + err = esp_sleep_enable_ulp_wakeup(); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_sleep_enable_ulp_wakeup failed: %s", esp_err_to_name(err)); + return err; + } + + s_armed = true; + ESP_LOGI(TAG, "LP-core armed: gpio=%d active_%s debounce=%d poll=%d µs", + wake_gpio, active_high ? "high" : "low", + CONFIG_C6_LP_DEBOUNCE_SAMPLES, CONFIG_C6_LP_POLL_PERIOD_US); + return ESP_OK; + +#else + /* --- Fallback path: plain deep-sleep GPIO wakeup (~10 µA floor) --- */ + uint64_t mask = 1ULL << wake_gpio; + esp_deepsleep_gpio_wake_up_mode_t mode = active_high + ? ESP_GPIO_WAKEUP_GPIO_HIGH + : ESP_GPIO_WAKEUP_GPIO_LOW; + esp_err_t err = esp_deep_sleep_enable_gpio_wakeup(mask, mode); + if (err != ESP_OK) { + ESP_LOGE(TAG, "enable_gpio_wakeup failed: %s", esp_err_to_name(err)); + return err; + } + s_armed = true; + ESP_LOGI(TAG, "GPIO-wakeup armed (no LP-core): gpio=%d active_%s", + wake_gpio, active_high ? "high" : "low"); + return ESP_OK; +#endif +} + +void c6_lp_core_hibernate_and_wait(void) +{ + if (!s_armed) { + ESP_LOGW(TAG, "hibernate called without arm — sleeping with no wake source"); + } + /* Power down the RTC peripheral domain — the LP-core itself stays + * powered on the LP power domain so it can keep polling. */ + esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF); + +#if defined(CONFIG_C6_LP_CORE_ENABLE) + ESP_LOGI(TAG, "entering deep sleep — LP-core polling, target ≤5 µA"); +#else + ESP_LOGI(TAG, "entering deep sleep — GPIO wakeup, target ~10 µA"); +#endif + esp_deep_sleep_start(); + /* Never returns. */ +} + +bool c6_lp_core_was_motion_wake(void) +{ + esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause(); +#if defined(CONFIG_C6_LP_CORE_ENABLE) + /* Real LP-core path: wakeup cause is ULP (LP-core triggered HP). */ + if (cause == ESP_SLEEP_WAKEUP_ULP) return true; +#endif + /* Fallback path or alternate GPIO wakeup. */ + return cause == ESP_SLEEP_WAKEUP_GPIO || cause == ESP_SLEEP_WAKEUP_EXT1; +} + +#if defined(CONFIG_C6_LP_CORE_ENABLE) +uint32_t c6_lp_core_motion_count(void) +{ + return (uint32_t)ulp_motion_count; +} + +uint32_t c6_lp_core_poll_count(void) +{ + return (uint32_t)ulp_poll_count; +} +#else +uint32_t c6_lp_core_motion_count(void) { return 0; } +uint32_t c6_lp_core_poll_count(void) { return 0; } +#endif + +#endif /* CONFIG_IDF_TARGET_ESP32C6 && CONFIG_ULP_COPROC_TYPE_LP_CORE */ diff --git a/firmware/esp32-csi-node/main/c6_lp_core.h b/firmware/esp32-csi-node/main/c6_lp_core.h new file mode 100644 index 00000000..9eaa1487 --- /dev/null +++ b/firmware/esp32-csi-node/main/c6_lp_core.h @@ -0,0 +1,77 @@ +/** + * @file c6_lp_core.h + * @brief LP-core wake-on-motion hibernation helper — ADR-110 Phase 5. + * + * Arms the C6 LP RISC-V coprocessor as an always-on watchdog that + * monitors a GPIO (typically a PIR or accelerometer interrupt line) and + * wakes the HP core only when motion is detected. Targets ~5 µA + * hibernation current for battery-powered Cognitum Seed nodes. + * + * Only built when CONFIG_IDF_TARGET_ESP32C6 + CONFIG_ULP_COPROC_TYPE_LP_CORE. + * + * P5 skeleton: the LP-core program is shipped as inline C compiled into + * the main image. A follow-up turn migrates it to a separate + * lp_core/main.c subproject with its own CMake. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" +#include +#include + +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_ULP_COPROC_TYPE_LP_CORE) + +/** + * Configure the LP-core wake-on-motion watcher. + * + * @param wake_gpio GPIO pin to monitor (must be an RTC/LP-domain GPIO). + * @param active_high true = wake on rising edge, false = falling. + * @return ESP_OK on success. + */ +esp_err_t c6_lp_core_arm(int wake_gpio, bool active_high); + +/** + * Enter deep sleep with the LP-core armed as the wake source. Does not + * return — the next boot will see ESP_SLEEP_WAKEUP_LP_CORE in + * esp_sleep_get_wakeup_cause(). + */ +void c6_lp_core_hibernate_and_wait(void); + +/** + * Returns true if the most recent boot was a wake from LP-core motion + * detection (vs a cold boot or different wake source). + */ +bool c6_lp_core_was_motion_wake(void); + +/** + * Monotonic counter of wake-triggering motion events observed by the + * LP-core program since the last cold boot. Returns 0 when + * CONFIG_C6_LP_CORE_ENABLE is unset (fallback path). + */ +uint32_t c6_lp_core_motion_count(void); + +/** + * Total LP-timer poll iterations executed by the LP-core program. + * Useful as a sanity check that the LP-core is actually running; + * returns 0 on the fallback path. + */ +uint32_t c6_lp_core_poll_count(void); + +#else + +static inline esp_err_t c6_lp_core_arm(int g, bool h) { (void)g; (void)h; return ESP_OK; } +static inline void c6_lp_core_hibernate_and_wait(void) { } +static inline bool c6_lp_core_was_motion_wake(void) { return false; } +static inline uint32_t c6_lp_core_motion_count(void) { return 0; } +static inline uint32_t c6_lp_core_poll_count(void) { return 0; } + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/firmware/esp32-csi-node/main/c6_softap_he.c b/firmware/esp32-csi-node/main/c6_softap_he.c new file mode 100644 index 00000000..7cde16f9 --- /dev/null +++ b/firmware/esp32-csi-node/main/c6_softap_he.c @@ -0,0 +1,177 @@ +/** + * @file c6_softap_he.c + * @brief ESP32-C6 soft-AP with HE/TWT — ADR-110 B1/B2 cheap-unblock. + * + * Pairs with c6_softap_he.h. Builds only when both targets are set: + * + * CONFIG_IDF_TARGET_ESP32C6 (selected by `idf.py set-target esp32c6`) + * CONFIG_C6_SOFTAP_HE_ENABLE (Kconfig, default n) + * + * The IDF v5.4 soft-AP path advertises HE automatically on chips with + * SOC_WIFI_HE_SUPPORT; the operator-side concern here is making sure + * the beacon also advertises `TWT Responder=1` so a STA-side + * `esp_wifi_sta_itwt_setup()` call doesn't bounce with `INVALID_ARG` + * the same way it did against `ruv.net` (the bench's 11n-only AP). + * + * TWT Responder advertisement in IDF v5.4 is gated by + * `wifi_he_ap_config_t.twt_responder = 1`. When the IDF header doesn't + * expose that struct (older v5.3), the AP still comes up with HE but + * without TWT Responder — we log a warning and continue so the build + * stays portable. + */ + +#include "sdkconfig.h" + +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_C6_SOFTAP_HE_ENABLE) + +#include "c6_softap_he.h" +#include "esp_log.h" +#include "esp_wifi.h" +#include "esp_wifi_types.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "nvs_flash.h" +#include "nvs.h" +#include + +static const char *TAG = "c6_softap"; + +static bool s_started = false; +static uint8_t s_sta_count = 0; +static uint8_t s_channel = 0; + +#ifndef CONFIG_C6_SOFTAP_HE_SSID +#define CONFIG_C6_SOFTAP_HE_SSID "ruview-c6-twt" +#endif +#ifndef CONFIG_C6_SOFTAP_HE_PSK +#define CONFIG_C6_SOFTAP_HE_PSK "ruviewtwt" +#endif +#ifndef CONFIG_C6_SOFTAP_HE_CHANNEL +#define CONFIG_C6_SOFTAP_HE_CHANNEL 6 +#endif + +static void load_nvs_override(const char *key, char *dst, size_t dst_len) +{ + nvs_handle_t h; + if (nvs_open("ruview", NVS_READONLY, &h) != ESP_OK) return; + size_t n = dst_len; + esp_err_t err = nvs_get_str(h, key, dst, &n); + if (err == ESP_OK) { + ESP_LOGI(TAG, "nvs override: %s=\"%s\"", key, dst); + } + nvs_close(h); +} + +static uint8_t load_nvs_u8(const char *key, uint8_t fallback) +{ + nvs_handle_t h; + if (nvs_open("ruview", NVS_READONLY, &h) != ESP_OK) return fallback; + uint8_t v = fallback; + if (nvs_get_u8(h, key, &v) == ESP_OK) { + ESP_LOGI(TAG, "nvs override: %s=%u", key, v); + } + nvs_close(h); + return v; +} + +static void on_wifi_event(void *arg, esp_event_base_t base, + int32_t event_id, void *event_data) +{ + (void)arg; (void)base; (void)event_data; + switch (event_id) { + case WIFI_EVENT_AP_START: + s_started = true; + ESP_LOGI(TAG, "AP started on channel %u", s_channel); + break; + case WIFI_EVENT_AP_STOP: + s_started = false; + ESP_LOGI(TAG, "AP stopped"); + break; + case WIFI_EVENT_AP_STACONNECTED: + if (s_sta_count < 255) s_sta_count++; + ESP_LOGI(TAG, "STA connected — total=%u", s_sta_count); + break; + case WIFI_EVENT_AP_STADISCONNECTED: + if (s_sta_count > 0) s_sta_count--; + ESP_LOGI(TAG, "STA disconnected — total=%u", s_sta_count); + break; + default: + break; + } +} + +esp_err_t c6_softap_he_start(uint8_t *out_channel) +{ + if (s_started) { + if (out_channel) *out_channel = s_channel; + return ESP_OK; + } + + /* Resolve config: NVS overrides Kconfig defaults. */ + char ssid[33] = CONFIG_C6_SOFTAP_HE_SSID; + char psk[64] = CONFIG_C6_SOFTAP_HE_PSK; + load_nvs_override("softap_ssid", ssid, sizeof(ssid)); + load_nvs_override("softap_psk", psk, sizeof(psk)); + s_channel = load_nvs_u8("softap_chan", CONFIG_C6_SOFTAP_HE_CHANNEL); + if (s_channel < 1 || s_channel > 13) s_channel = CONFIG_C6_SOFTAP_HE_CHANNEL; + + /* AP+STA so the existing STA path keeps working (NVS-provisioned upstream). */ + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA)); + + wifi_config_t ap_cfg = {0}; + size_t ssid_len = strlen(ssid); + if (ssid_len > 32) ssid_len = 32; + memcpy(ap_cfg.ap.ssid, ssid, ssid_len); + ap_cfg.ap.ssid_len = (uint8_t)ssid_len; + strncpy((char *)ap_cfg.ap.password, psk, sizeof(ap_cfg.ap.password) - 1); + ap_cfg.ap.channel = s_channel; + ap_cfg.ap.max_connection = 4; + ap_cfg.ap.authmode = strlen(psk) >= 8 ? WIFI_AUTH_WPA2_PSK : WIFI_AUTH_OPEN; + ap_cfg.ap.beacon_interval = 100; + /* pmf_cfg.required = false keeps backward compatibility for STA clients + * that don't speak PMF. */ + ap_cfg.ap.pmf_cfg.required = false; + + /* Register the event handler before bringing the AP up so we don't + * miss WIFI_EVENT_AP_START. */ + ESP_ERROR_CHECK(esp_event_handler_instance_register( + WIFI_EVENT, ESP_EVENT_ANY_ID, on_wifi_event, NULL, NULL)); + + esp_err_t err = esp_wifi_set_config(WIFI_IF_AP, &ap_cfg); + if (err != ESP_OK) { + ESP_LOGE(TAG, "set_config(AP) failed: %s", esp_err_to_name(err)); + return err; + } + + /* IDF v5.4 LIMIT (verified empirically 2026-05-23 — WITNESS-LOG-110 §A0.6): + * the public API exposes ONLY STA-side iTWT/bTWT (esp_wifi_sta_itwt_*, + * esp_wifi_sta_btwt_*). There is NO esp_wifi_ap_set_he_config(), NO + * wifi_he_ap_config_t, and NO wifi_config_t.ap.he_* field. A second C6 + * associating against this soft-AP currently lands at phymode 11bgn + * (he:0, vht:0, ht:1) — the AP doesn't advertise HE because there's no + * way to ask it to. A future IDF release that exposes AP-side HE config + * (or a patched WiFi blob) is required to make this AP iTWT-capable. + * + * Until then, this module still gives you a working WPA2 soft-AP on a + * controlled channel for AP+STA bench experiments and ESP-NOW peer + * discovery — just not iTWT validation. The c6_twt module on the STA + * side will return ESP_ERR_INVALID_ARG against this AP (no TWT Responder + * in the beacon), exactly as it does against any other 11n-only AP. */ + ESP_LOGI(TAG, "soft-AP starting: ssid=\"%s\" channel=%u auth=%s", + ssid, s_channel, + ap_cfg.ap.authmode == WIFI_AUTH_OPEN ? "open" : "wpa2-psk"); + ESP_LOGW(TAG, "IDF v5.4 soft-AP does NOT advertise HE — STAs will associate at 11bgn. " + "iTWT validation requires an external 11ax AP. See WITNESS-LOG-110 §A0.6."); + + /* Don't call esp_wifi_start() here — main.c brings the WiFi up once + * for both AP and STA. We just configured the AP iface so it joins + * the existing start. */ + + if (out_channel) *out_channel = s_channel; + return ESP_OK; +} + +bool c6_softap_he_is_up(void) { return s_started; } +uint8_t c6_softap_he_sta_count(void) { return s_sta_count; } + +#endif /* CONFIG_IDF_TARGET_ESP32C6 && CONFIG_C6_SOFTAP_HE_ENABLE */ diff --git a/firmware/esp32-csi-node/main/c6_softap_he.h b/firmware/esp32-csi-node/main/c6_softap_he.h new file mode 100644 index 00000000..7e27ada6 --- /dev/null +++ b/firmware/esp32-csi-node/main/c6_softap_he.h @@ -0,0 +1,66 @@ +/** + * @file c6_softap_he.h + * @brief ESP32-C6 soft-AP with Wi-Fi 6 (HE) capability + TWT Responder. + * + * ADR-110 §B1/B2 cheap-unblock: turn one C6 board into the iTWT-capable + * AP that the C6-DevKit-on-the-shelf-only bench is missing. A second C6 + * board in STA mode can then negotiate a real iTWT agreement against + * this AP and measure deterministic CSI cadence — without buying an + * 11ax router. + * + * Build-gated by CONFIG_C6_SOFTAP_HE_ENABLE (default n). When disabled, + * all functions become no-ops so non-AP firmwares pay zero overhead. + * + * NVS overrides (read at boot if present, fall back to Kconfig defaults): + * softap_ssid (string, up to 32 chars) + * softap_psk (string, 8..63 chars) + * softap_chan (u8, 1..13) + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" +#include +#include + +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_C6_SOFTAP_HE_ENABLE) + +/** + * Bring up the soft-AP in AP+STA mode with HE (Wi-Fi 6) advertised and + * TWT Responder=1 if the IDF build supports it. Idempotent — safe to + * call once during boot after `esp_wifi_init()`. Returns the channel + * the AP is actually running on (may differ from Kconfig if the IDF + * scanner picks a clearer channel). + */ +esp_err_t c6_softap_he_start(uint8_t *out_channel); + +/** + * True after the IDF reports the AP has started successfully. + */ +bool c6_softap_he_is_up(void); + +/** + * Number of currently associated stations (read-only, refreshed on the + * WIFI_EVENT_AP_STACONNECTED/DISCONNECTED events). + */ +uint8_t c6_softap_he_sta_count(void); + +#else /* disabled — no-op stubs */ + +static inline esp_err_t c6_softap_he_start(uint8_t *out_channel) +{ + if (out_channel) *out_channel = 0; + return ESP_OK; +} +static inline bool c6_softap_he_is_up(void) { return false; } +static inline uint8_t c6_softap_he_sta_count(void) { return 0; } + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/firmware/esp32-csi-node/main/c6_sync_espnow.c b/firmware/esp32-csi-node/main/c6_sync_espnow.c new file mode 100644 index 00000000..fbdf4054 --- /dev/null +++ b/firmware/esp32-csi-node/main/c6_sync_espnow.c @@ -0,0 +1,239 @@ +/** + * @file c6_sync_espnow.c + * @brief ESP-NOW cross-node time-sync — ADR-110 D1 workaround. + * + * Same protocol as c6_timesync.c (TS_BEACON every 100 ms with leader epoch), + * but over ESP-NOW instead of 802.15.4 because the IDF v5.4 ieee802154 RX + * path doesn't deliver frames to user-space (see WITNESS-LOG-110 §D1). + * + * Frame layout (16 bytes payload, broadcast MAC FF:FF:FF:FF:FF:FF): + * [0..3] Magic 0x53454E50 ('SENP' — Sync via ESP-NOW) + * [4] Protocol ver 0x01 + * [5] Leader flag 1 if sender claims leader + * [6..7] Reserved + * [8..15] Leader epoch µs (LE u64) + */ + +#include "sdkconfig.h" +#include "c6_sync_espnow.h" +#include "esp_log.h" +#include "esp_now.h" +#include "esp_wifi.h" +#include "esp_mac.h" +#include "esp_timer.h" +#include "freertos/FreeRTOS.h" +#include "freertos/timers.h" +#include + +static const char *TAG = "c6_espnow"; + +#define BEACON_MAGIC 0x53454E50u /* 'SENP' little-endian */ +#define BEACON_PROTO_VER 0x01 +#define BEACON_PERIOD_MS 100 +#define VALID_WINDOW_MS 3000 + +typedef struct __attribute__((packed)) { + uint32_t magic; + uint8_t proto_ver; + uint8_t leader_flag; + uint16_t _reserved; + uint64_t leader_epoch_us; +} espnow_beacon_t; + +static const uint8_t s_broadcast_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + +static uint64_t s_local_id = 0; /* 6-byte MAC packed into u64 */ +static uint64_t s_leader_id = 0; +static int64_t s_offset_us = 0; +static uint64_t s_last_seen_us = 0; +static bool s_is_leader = false; +static TimerHandle_t s_beacon_timer = NULL; + +static uint32_t s_tx_count = 0; +static uint32_t s_tx_fail = 0; +static uint32_t s_rx_count = 0; +static uint32_t s_rx_magic_match = 0; + +/* ADR-110 P10 — EMA-smoothed offset (host-side trajectory in firmware). + * + * The §A0.8 four-minute soak measured 540 µs sample-stdev around a true + * offset that drifts at ≈1.4 ppm between two C6 crystals. An exponential + * moving average with α=0.125 (Q3.3 fixed-point shift = 3) yields an + * effective ~8-sample window, fast enough to track the drift (~7 µs/sec + * worst-case) while suppressing the per-beacon WiFi-MAC jitter. + * + * Two consumers: get_offset_us() (raw, unchanged — for diagnostics) and + * get_offset_us_smoothed() (filtered — what CSI frames should stamp). + * Both expose `int64_t` so call sites stay identical. */ +#define OFFSET_EMA_SHIFT 3 /* α = 1/8 = 0.125 */ +static int64_t s_offset_us_smoothed = 0; +static bool s_smoothed_seeded = false; + +static uint64_t mac6_to_u64(const uint8_t mac[6]) +{ + return ((uint64_t)mac[0] << 40) | ((uint64_t)mac[1] << 32) | + ((uint64_t)mac[2] << 24) | ((uint64_t)mac[3] << 16) | + ((uint64_t)mac[4] << 8) | (uint64_t)mac[5]; +} + +static void send_beacon(void) +{ + espnow_beacon_t b = { + .magic = BEACON_MAGIC, + .proto_ver = BEACON_PROTO_VER, + .leader_flag = s_is_leader ? 1 : 0, + ._reserved = 0, + .leader_epoch_us = (uint64_t)esp_timer_get_time(), + }; + esp_err_t r = esp_now_send(s_broadcast_mac, (uint8_t *)&b, sizeof(b)); + s_tx_count++; + if (r != ESP_OK) s_tx_fail++; + /* Diag log every 50 beacons. */ + if ((s_tx_count % 50) == 1) { + ESP_LOGI(TAG, "tx#%lu (fail=%lu) rx#%lu (match=%lu) leader=%d offset_us=%lld smoothed=%lld", + (unsigned long)s_tx_count, (unsigned long)s_tx_fail, + (unsigned long)s_rx_count, (unsigned long)s_rx_magic_match, + (int)s_is_leader, (long long)s_offset_us, + (long long)s_offset_us_smoothed); + } +} + +/* IDF v5.4 ESP-NOW recv callback signature uses esp_now_recv_info_t. + * Falls back to the older signature on older IDF via ifdef. */ +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) +static void on_recv(const esp_now_recv_info_t *info, + const uint8_t *data, int len) +{ + const uint8_t *src_mac = info ? info->src_addr : NULL; +#else +static void on_recv(const uint8_t *src_mac, const uint8_t *data, int len) +{ +#endif + s_rx_count++; + if (data == NULL || len < (int)sizeof(espnow_beacon_t)) return; + const espnow_beacon_t *b = (const espnow_beacon_t *)data; + if (b->magic != BEACON_MAGIC || b->proto_ver != BEACON_PROTO_VER) return; + s_rx_magic_match++; + uint64_t sender_id = src_mac ? mac6_to_u64(src_mac) : 0; + uint64_t now_us = (uint64_t)esp_timer_get_time(); + + /* Adopt sender as leader if it's claiming leadership AND its ID is + * lower than our current leader (or we have no leader). Lowest MAC + * wins — deterministic. */ + if (b->leader_flag && (s_leader_id == 0 || sender_id < s_leader_id)) { + if (s_is_leader && sender_id < s_local_id) { + ESP_LOGI(TAG, "stepping down: heard lower-id leader %012llx (we are %012llx)", + (unsigned long long)sender_id, (unsigned long long)s_local_id); + s_is_leader = false; + } + s_leader_id = sender_id; + } + + /* If accepted leader, compute offset from their epoch (only for non-leader). */ + if (b->leader_flag && !s_is_leader && sender_id == s_leader_id) { + int64_t raw = (int64_t)b->leader_epoch_us - (int64_t)now_us; + s_offset_us = raw; + s_last_seen_us = now_us; + /* EMA: y[n] = y[n-1] + (raw - y[n-1]) >> SHIFT */ + if (!s_smoothed_seeded) { + s_offset_us_smoothed = raw; + s_smoothed_seeded = true; + } else { + s_offset_us_smoothed += (raw - s_offset_us_smoothed) >> OFFSET_EMA_SHIFT; + } + } +} + +static void on_send(const uint8_t *mac, esp_now_send_status_t status) +{ + (void)mac; + if (status != ESP_NOW_SEND_SUCCESS) s_tx_fail++; +} + +static void beacon_timer_cb(TimerHandle_t t) +{ + (void)t; + uint64_t now = (uint64_t)esp_timer_get_time(); + /* Promote self if no leader beacon for VALID_WINDOW_MS and we have lowest known id. */ + if (!s_is_leader && (now - s_last_seen_us) > (VALID_WINDOW_MS * 1000ULL)) { + if (s_leader_id == 0 || s_local_id < s_leader_id) { + s_is_leader = true; + s_leader_id = s_local_id; + s_offset_us = 0; + ESP_LOGI(TAG, "promoting self to leader (no beacons for %u ms; local_id=%012llx)", + (unsigned)VALID_WINDOW_MS, (unsigned long long)s_local_id); + } + } + send_beacon(); +} + +esp_err_t c6_sync_espnow_init(void) +{ + uint8_t mac[6]; + esp_read_mac(mac, ESP_MAC_WIFI_STA); + s_local_id = mac6_to_u64(mac); + + esp_err_t r = esp_now_init(); + if (r != ESP_OK) { + ESP_LOGE(TAG, "esp_now_init failed: %s", esp_err_to_name(r)); + return r; + } + esp_now_register_recv_cb(on_recv); + esp_now_register_send_cb(on_send); + + /* Add broadcast peer so esp_now_send to FF:FF:FF:FF:FF:FF works. */ + esp_now_peer_info_t peer = {0}; + memcpy(peer.peer_addr, s_broadcast_mac, 6); + peer.channel = 0; /* current STA channel */ + peer.ifidx = WIFI_IF_STA; + peer.encrypt = false; + r = esp_now_add_peer(&peer); + if (r != ESP_OK && r != ESP_ERR_ESPNOW_EXIST) { + ESP_LOGW(TAG, "esp_now_add_peer(broadcast) failed: %s", esp_err_to_name(r)); + } + + /* Start as candidate leader — will step down on receiving lower-id beacon. */ + s_is_leader = true; + s_leader_id = s_local_id; + s_last_seen_us = (uint64_t)esp_timer_get_time(); + + s_beacon_timer = xTimerCreate("c6_espnow_beacon", + pdMS_TO_TICKS(BEACON_PERIOD_MS), + pdTRUE, NULL, beacon_timer_cb); + if (s_beacon_timer == NULL) { + ESP_LOGE(TAG, "xTimerCreate failed"); + return ESP_ERR_NO_MEM; + } + xTimerStart(s_beacon_timer, 0); + + ESP_LOGI(TAG, "init done: local_id=%012llx leader=yes(candidate) period=%ums", + (unsigned long long)s_local_id, (unsigned)BEACON_PERIOD_MS); + return ESP_OK; +} + +uint64_t c6_sync_espnow_get_epoch_us(void) +{ + /* Prefer the smoothed offset once we've heard a leader beacon; falls + * back to raw=0 on the leader board and during the first second after + * follower boot. The smoothed value is what CSI frames should stamp + * for cross-board multistatic alignment (§A0.8 measured 540 µs raw + * stdev → expected <100 µs smoothed with α=1/8 over ~8 samples). */ + int64_t off = s_smoothed_seeded ? s_offset_us_smoothed : s_offset_us; + return (uint64_t)((int64_t)esp_timer_get_time() + off); +} + +bool c6_sync_espnow_is_leader(void) { return s_is_leader; } +int64_t c6_sync_espnow_get_offset_us(void) { return s_offset_us; } +int64_t c6_sync_espnow_get_offset_us_smoothed(void) { return s_offset_us_smoothed; } + +bool c6_sync_espnow_is_valid(void) +{ + if (s_is_leader) return true; + uint64_t now = (uint64_t)esp_timer_get_time(); + return (now - s_last_seen_us) < (VALID_WINDOW_MS * 1000ULL); +} + +uint32_t c6_sync_espnow_tx_count(void) { return s_tx_count; } +uint32_t c6_sync_espnow_tx_fail(void) { return s_tx_fail; } +uint32_t c6_sync_espnow_rx_count(void) { return s_rx_count; } +uint32_t c6_sync_espnow_rx_magic_match(void) { return s_rx_magic_match; } diff --git a/firmware/esp32-csi-node/main/c6_sync_espnow.h b/firmware/esp32-csi-node/main/c6_sync_espnow.h new file mode 100644 index 00000000..c8993896 --- /dev/null +++ b/firmware/esp32-csi-node/main/c6_sync_espnow.h @@ -0,0 +1,68 @@ +/** + * @file c6_sync_espnow.h + * @brief ESP-NOW based cross-node time-sync — ADR-110 D1 workaround. + * + * After 4 systematic experiments confirmed the 802.15.4 RX path is broken + * in this user-code + IDF v5.4 combination (see WITNESS-LOG-110 §D1), the + * cross-node sync claim was unblocked by switching transport from IEEE + * 802.15.4 to ESP-NOW (WiFi-based peer-to-peer, runs on the same 2.4 GHz + * radio but uses the WiFi MAC layer that ESP-IDF's 802.11 driver fully + * supports). + * + * Trade vs. 802.15.4: + * - Loses the "frees WiFi airtime for CSI" property (uses WiFi for sync) + * - Gains a known-working RX path on every ESP32 family + * - Same API surface (epoch_us, is_valid, is_leader) so call sites that + * used to depend on c6_timesync drop in unchanged + * + * Works on both ESP32-S3 and ESP32-C6 — the cross-node sync becomes a + * cross-target feature, not C6-only. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" +#include +#include + +/** + * Initialize the ESP-NOW sync module. Must be called AFTER WiFi STA is + * connected (ESP-NOW needs the WiFi driver active). + * + * @return ESP_OK on success. + */ +esp_err_t c6_sync_espnow_init(void); + +/** + * Returns the synced wall-clock estimate in microseconds. + * If no leader heard within the timeout, returns the local + * esp_timer_get_time() value unchanged (offset = 0). + */ +uint64_t c6_sync_espnow_get_epoch_us(void); + +bool c6_sync_espnow_is_leader(void); +bool c6_sync_espnow_is_valid(void); +int64_t c6_sync_espnow_get_offset_us(void); + +/** + * EMA-smoothed offset (α=1/8, ~8-sample effective window at the 10 Hz + * beacon rate). Tracks the ≈1.4 ppm crystal drift between two C6 boards + * (measured in §A0.8) while suppressing the 540 µs per-beacon WiFi-MAC + * jitter. CSI frame timestamps should stamp from this value, not the raw + * offset — `c6_sync_espnow_get_epoch_us()` already does so internally. + */ +int64_t c6_sync_espnow_get_offset_us_smoothed(void); + +/* Counters for the witness harness — exposed for tests/diagnostics. */ +uint32_t c6_sync_espnow_tx_count(void); +uint32_t c6_sync_espnow_tx_fail(void); +uint32_t c6_sync_espnow_rx_count(void); +uint32_t c6_sync_espnow_rx_magic_match(void); + +#ifdef __cplusplus +} +#endif diff --git a/firmware/esp32-csi-node/main/c6_timesync.c b/firmware/esp32-csi-node/main/c6_timesync.c new file mode 100644 index 00000000..4697696e --- /dev/null +++ b/firmware/esp32-csi-node/main/c6_timesync.c @@ -0,0 +1,265 @@ +/** + * @file c6_timesync.c + * @brief 802.15.4 mesh time-sync skeleton — ADR-110 Phase 4. + * + * P4 ships the API surface, role election, and the leader-broadcast + + * follower-receive paths using esp_ieee802154 raw frames. Full + * OpenThread MTD attachment with a real network key is deferred to a + * follow-up turn — the skeleton already exercises the radio init and + * the offset-tracking math. + * + * Beacon frame layout (12 bytes payload + 802.15.4 MAC header): + * [0..3] Magic 0x54534D45 ('TSME' — Time Sync MEsh) + * [4] Protocol ver 0x01 + * [5] Leader flag 1 if sender is current leader + * [6..7] Reserved + * [8..15] Leader epoch µs (LE u64) + */ + +#include "sdkconfig.h" + +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_IEEE802154_ENABLED) + +#include "c6_timesync.h" +#include "esp_log.h" +#include "esp_mac.h" +#include "esp_timer.h" +#include "esp_ieee802154.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/timers.h" +#include + +static const char *TAG = "c6_ts"; + +#define TS_MAGIC 0x54534D45u +#define TS_PROTO_VER 0x01 +#define TS_BEACON_MS 100 +#define TS_VALID_WINDOW_MS 3000 /* drop to invalid if no beacon in 3 s */ + +typedef struct __attribute__((packed)) { + uint32_t magic; + uint8_t proto_ver; + uint8_t leader_flag; + uint16_t _reserved; + uint64_t leader_epoch_us; +} ts_beacon_t; + +static uint64_t s_local_eui = 0; +static uint64_t s_leader_eui = 0; /* 0 = unknown */ +static int64_t s_offset_us = 0; /* leader_us - local_us */ +static uint64_t s_last_seen_us = 0; +static bool s_is_leader = false; +static uint8_t s_channel = 15; +static TimerHandle_t s_beacon_timer = NULL; + +/* IEEE EUI-64 from a 6-byte MAC-48: insert 0xFFFE between bytes 2 and 3. + * Used only as a fallback when esp_read_mac(..., ESP_MAC_IEEE802154) is + * unavailable. The C6's native call returns 8 bytes already in EUI-64 + * format, so prefer that path (see c6_timesync_init). */ +static uint64_t mac48_to_eui64(const uint8_t mac[6]) +{ + return ((uint64_t)mac[0] << 56) | ((uint64_t)mac[1] << 48) | + ((uint64_t)mac[2] << 40) | ((uint64_t)0xFF << 32) | + ((uint64_t)0xFE << 24) | ((uint64_t)mac[3] << 16) | + ((uint64_t)mac[4] << 8 ) | (uint64_t)mac[5]; +} + +/* Pack 8 already-EUI-64 bytes into a uint64. */ +static uint64_t eui64_bytes_to_u64(const uint8_t eui[8]) +{ + return ((uint64_t)eui[0] << 56) | ((uint64_t)eui[1] << 48) | + ((uint64_t)eui[2] << 40) | ((uint64_t)eui[3] << 32) | + ((uint64_t)eui[4] << 24) | ((uint64_t)eui[5] << 16) | + ((uint64_t)eui[6] << 8 ) | (uint64_t)eui[7]; +} + +static uint32_t s_tx_count = 0; +static uint32_t s_tx_fail = 0; +static uint32_t s_rx_count = 0; +static uint32_t s_rx_magic_match = 0; + +static void send_beacon(void) +{ + uint8_t frame[32]; + /* Minimal 802.15.4 MAC header: FCF + seq + dst PAN + dst short addr. */ + frame[0] = 0x41; /* FCF lo: data frame, no security, no ack */ + frame[1] = 0x88; /* FCF hi: short addrs, intra-PAN */ + frame[2] = 0x00; /* seq number — placeholder */ + /* Empirically (rx#0 over 60s on all 3 boards), the IDF v5.4 receiver + * was rejecting the dst-PAN-broadcast (0xFFFF) frames even in + * promiscuous mode. Match our configured PAN ID 0xCAFE here — short + * dst stays 0xFFFF for intra-PAN broadcast. PAN bytes are LE. */ + frame[3] = 0xFE; frame[4] = 0xCA; /* dst PAN = 0xCAFE (matches local) */ + frame[5] = 0xFF; frame[6] = 0xFF; /* dst short broadcast */ + frame[7] = 0x00; frame[8] = 0x00; /* src short = 0x0000 */ + ts_beacon_t *b = (ts_beacon_t *)&frame[9]; + b->magic = TS_MAGIC; + b->proto_ver = TS_PROTO_VER; + b->leader_flag = 1; + b->_reserved = 0; + b->leader_epoch_us = (uint64_t)esp_timer_get_time(); + size_t total = 9 + sizeof(ts_beacon_t); + /* ESP-IDF esp_ieee802154 transmit: first byte is the PHY length. */ + uint8_t tx_buf[64]; + tx_buf[0] = (uint8_t)(total + 2); /* +2 for FCS appended by HW */ + memcpy(&tx_buf[1], frame, total); + esp_err_t r = esp_ieee802154_transmit(tx_buf, false); + s_tx_count++; + if (r != ESP_OK) s_tx_fail++; + /* Diag log every 10 beacons. */ + if ((s_tx_count % 10) == 1) { + ESP_LOGI(TAG, "tx#%lu (fail=%lu) rx#%lu (magic_match=%lu) is_leader=%d", + (unsigned long)s_tx_count, (unsigned long)s_tx_fail, + (unsigned long)s_rx_count, (unsigned long)s_rx_magic_match, + (int)s_is_leader); + } +} + +/* KNOWN ISSUE (see WITNESS-LOG-110 §D1 / task #30): + * Empirically observed on 3 C6 boards with channel=26, OpenThread disabled, + * promiscuous=true, and IDF v5.4 reference RX/TX callback pattern: only 1 + * RX event ever fires after init, despite ~381 successful TX events from + * the other boards in the same 38-second window. Manual re-arm with + * esp_ieee802154_receive() in either callback context bootloops the + * driver. Hypothesis: half-duplex radio + driver state-machine issue; + * needs an IDF maintainer trace or a working multi-board reference. + * Cross-node sync claim (ADR-110 §B3) is BLOCKED on this. */ +void esp_ieee802154_receive_done(uint8_t *frame, esp_ieee802154_frame_info_t *frame_info) +{ + s_rx_count++; + /* PHY length is frame[0]; payload starts at frame[1]. */ + if (frame == NULL || frame[0] < (9 + sizeof(ts_beacon_t) + 2)) { + if (frame) esp_ieee802154_receive_handle_done(frame); + return; + } + const ts_beacon_t *b = (const ts_beacon_t *)&frame[1 + 9]; + if (b->magic != TS_MAGIC || b->proto_ver != TS_PROTO_VER) { + esp_ieee802154_receive_handle_done(frame); + return; + } + s_rx_magic_match++; + uint64_t now = (uint64_t)esp_timer_get_time(); + if (b->leader_flag) { + /* Adopt this leader if its EUI is lower than ours (or unknown). */ + if (s_leader_eui == 0 || b->leader_epoch_us > 0) { + s_offset_us = (int64_t)b->leader_epoch_us - (int64_t)now; + s_last_seen_us = now; + if (s_is_leader) { + /* Step down — somebody else is broadcasting; lowest EUI wins + * (deferred — for now last-heard wins). */ + s_is_leader = false; + ESP_LOGI(TAG, "stepping down — heard another leader beacon"); + } + } + } + /* handle_done auto-restarts RX in the IDF driver; calling + * esp_ieee802154_receive() here would double-arm and panic + * (verified empirically — 25 reboot loops observed). */ + esp_ieee802154_receive_handle_done(frame); +} + +void esp_ieee802154_transmit_done(const uint8_t *frame, + const uint8_t *ack, + esp_ieee802154_frame_info_t *ack_frame_info) +{ + (void)frame; (void)ack; (void)ack_frame_info; + /* Note: do NOT call esp_ieee802154_receive() here — it panics the + * driver (verified empirically, all 3 boards bootloop). The IDF + * driver internally manages RX/TX state transitions. */ +} + +void esp_ieee802154_transmit_failed(const uint8_t *frame, esp_ieee802154_tx_error_t error) +{ + (void)frame; + ESP_LOGD(TAG, "tx failed: %d", error); +} + +static void beacon_timer_cb(TimerHandle_t t) +{ + (void)t; + uint64_t now = (uint64_t)esp_timer_get_time(); + if (s_is_leader) { + send_beacon(); + } else if ((now - s_last_seen_us) > (TS_VALID_WINDOW_MS * 1000ULL)) { + /* Lost the leader — promote self if no one else takes over in 1 s. */ + s_is_leader = true; + s_leader_eui = s_local_eui; + ESP_LOGI(TAG, "promoting self to time-leader (no beacons for %u ms)", + (unsigned)TS_VALID_WINDOW_MS); + } +} + +esp_err_t c6_timesync_init(uint8_t channel) +{ + /* esp_mac.h: ESP_MAC_IEEE802154 returns 8 bytes ALREADY in EUI-64 format + * (ff:fe is pre-inserted in bytes 3-4 from the eFuse MAC_EXT). Using a + * 6-byte buffer here truncates and then double-inserts ff:fe — the bug + * we hit on the first run (boot log: EUI=206ef1fffefffe17). + * + * Correct path: read 8 bytes, pack into uint64 unchanged. Fallback to + * the base MAC + manual EUI-64 derivation if the 8-byte read errors. */ + uint8_t eui_bytes[8] = {0}; + esp_err_t mac_ret = esp_read_mac(eui_bytes, ESP_MAC_IEEE802154); + if (mac_ret == ESP_OK) { + s_local_eui = eui64_bytes_to_u64(eui_bytes); + } else { + uint8_t base_mac[6]; + esp_read_mac(base_mac, ESP_MAC_BASE); + s_local_eui = mac48_to_eui64(base_mac); + } + /* Use the 6-byte base MAC for the IEEE 802.15.4 extended address — the + * radio expects MAC-48-style bytes here, not the EUI-64 derivation. */ + uint8_t mac[6]; + esp_read_mac(mac, ESP_MAC_BASE); + s_channel = (channel >= 11 && channel <= 26) ? channel : 15; + + esp_err_t ret = esp_ieee802154_enable(); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "ieee802154_enable failed: %s", esp_err_to_name(ret)); + return ret; + } + /* promiscuous=true so we accept broadcast frames addressed to 0xFFFF. + * In non-promiscuous mode the radio filters to frames addressed to + * our short or extended address. Our beacon protocol uses broadcast. */ + esp_ieee802154_set_promiscuous(true); + esp_ieee802154_set_panid(0xCAFE); + esp_ieee802154_set_short_address(0x0000); + esp_ieee802154_set_extended_address(mac); + esp_ieee802154_set_channel(s_channel); + esp_ieee802154_receive(); + + /* Start as candidate leader; first received beacon will demote us if needed. */ + s_is_leader = true; + s_leader_eui = s_local_eui; + s_last_seen_us = (uint64_t)esp_timer_get_time(); + + s_beacon_timer = xTimerCreate("c6ts_beacon", pdMS_TO_TICKS(TS_BEACON_MS), + pdTRUE, NULL, beacon_timer_cb); + if (s_beacon_timer == NULL) { + ESP_LOGE(TAG, "xTimerCreate failed"); + return ESP_ERR_NO_MEM; + } + xTimerStart(s_beacon_timer, 0); + + ESP_LOGI(TAG, "init done: channel=%u EUI=%016llx leader=yes(candidate)", + (unsigned)s_channel, (unsigned long long)s_local_eui); + return ESP_OK; +} + +uint64_t c6_timesync_get_epoch_us(void) +{ + return (uint64_t)((int64_t)esp_timer_get_time() + s_offset_us); +} + +bool c6_timesync_is_leader(void) { return s_is_leader; } +int64_t c6_timesync_get_offset_us(void) { return s_offset_us; } + +bool c6_timesync_is_valid(void) +{ + if (s_is_leader) return true; + uint64_t now = (uint64_t)esp_timer_get_time(); + return (now - s_last_seen_us) < (TS_VALID_WINDOW_MS * 1000ULL); +} + +#endif /* CONFIG_IDF_TARGET_ESP32C6 && CONFIG_IEEE802154_ENABLED */ diff --git a/firmware/esp32-csi-node/main/c6_timesync.h b/firmware/esp32-csi-node/main/c6_timesync.h new file mode 100644 index 00000000..4912636b --- /dev/null +++ b/firmware/esp32-csi-node/main/c6_timesync.h @@ -0,0 +1,77 @@ +/** + * @file c6_timesync.h + * @brief 802.15.4 mesh time-sync — ADR-110 Phase 4. + * + * Provides cross-node clock alignment over a separate 802.15.4 radio so + * the WiFi airtime stays clean for CSI sensing. Solves the multistatic + * synchronization problem (ADR-029/030) without burning the sensing + * channel on coordination traffic. + * + * Protocol (skeleton — full Thread join deferred to a follow-up phase): + * - One node is elected time-leader (lowest 64-bit EUI on the mesh). + * - Leader broadcasts a TS_BEACON every 100 ms on 802.15.4 channel 15. + * - Followers compute offset = leader_us - local_us, apply lazily. + * - Each CSI frame is stamped with c6_timesync_get_epoch_us(). + * + * Only built when CONFIG_IDF_TARGET_ESP32C6 + CONFIG_IEEE802154_ENABLED. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" +#include +#include + +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_IEEE802154_ENABLED) + +/** + * Initialize the 802.15.4 radio and time-sync state machine. + * Picks leader or follower role based on EUI comparison. + * + * @param channel 802.15.4 channel (11-26, default 15). + * @return ESP_OK on success. + */ +esp_err_t c6_timesync_init(uint8_t channel); + +/** + * Returns the synced wall-clock estimate in microseconds. + * If no leader heard within the timeout, returns the local + * esp_timer_get_time() value unchanged (offset = 0). + */ +uint64_t c6_timesync_get_epoch_us(void); + +/** + * Returns true if this node is currently the time-leader. + */ +bool c6_timesync_is_leader(void); + +/** + * Returns true if the local clock is synced (heard a beacon within timeout). + */ +bool c6_timesync_is_valid(void); + +/** + * Returns the most-recently-measured offset from the leader (microseconds). + * 0 if this node is the leader; sign indicates direction. + */ +int64_t c6_timesync_get_offset_us(void); + +#else /* not C6 with 802.15.4 — provide stubs so call sites compile */ + +#include "esp_timer.h" + +static inline esp_err_t c6_timesync_init(uint8_t c) { (void)c; return ESP_OK; } +static inline uint64_t c6_timesync_get_epoch_us(void) { return (uint64_t)esp_timer_get_time(); } +static inline bool c6_timesync_is_leader(void) { return false; } +static inline bool c6_timesync_is_valid(void) { return false; } +static inline int64_t c6_timesync_get_offset_us(void) { return 0; } + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/firmware/esp32-csi-node/main/c6_twt.c b/firmware/esp32-csi-node/main/c6_twt.c new file mode 100644 index 00000000..71961c78 --- /dev/null +++ b/firmware/esp32-csi-node/main/c6_twt.c @@ -0,0 +1,155 @@ +/** + * @file c6_twt.c + * @brief ESP32-C6 TWT setup implementation — ADR-110 Phase 3. + * + * Implementation note: ESP-IDF v5.4's iTWT API on C6 is + * + * esp_err_t esp_wifi_sta_itwt_setup(wifi_itwt_setup_config_t *cfg); + * esp_err_t esp_wifi_sta_itwt_teardown(uint8_t flow_id); + * + * The setup is asynchronous — the actual accept/reject arrives later as + * a WIFI_EVENT_ITWT_SETUP event. The default handler in this module + * logs the outcome; the helper itself returns as soon as the request + * is queued. + */ + +#include "sdkconfig.h" +#include "soc/soc_caps.h" + +#if defined(CONFIG_IDF_TARGET_ESP32C6) && SOC_WIFI_HE_SUPPORT + +#include "c6_twt.h" +#include "esp_log.h" +#include "esp_wifi.h" +#include "esp_wifi_he.h" /* esp_wifi_sta_itwt_setup / _teardown */ +#include "esp_wifi_he_types.h" +#include "esp_wifi_types.h" +#include "esp_event.h" +#include + +static const char *TAG = "c6_twt"; + +static bool s_active = false; +static uint8_t s_flow_id = 0; +static uint32_t s_wake_int = 0; +static uint32_t s_wake_dura = 0; + +#ifndef CONFIG_C6_TWT_WAKE_INTERVAL_US +#define CONFIG_C6_TWT_WAKE_INTERVAL_US 10000 /* 100 fps default cadence */ +#endif + +#ifndef CONFIG_C6_TWT_MIN_WAKE_DURA_US +#define CONFIG_C6_TWT_MIN_WAKE_DURA_US 512 /* enough to capture 1 CSI frame */ +#endif + +/* WIFI_EVENT_ITWT_SETUP handler — logs accept/reject. */ +static void on_itwt_event(void *arg, esp_event_base_t base, + int32_t event_id, void *event_data) +{ + (void)arg; + (void)base; + (void)event_data; + switch (event_id) { + case WIFI_EVENT_ITWT_SETUP: + ESP_LOGI(TAG, "iTWT setup event received from AP (flow_id captured)"); + s_active = true; + break; + case WIFI_EVENT_ITWT_TEARDOWN: + ESP_LOGI(TAG, "iTWT teardown event received"); + s_active = false; + break; + case WIFI_EVENT_ITWT_SUSPEND: + ESP_LOGI(TAG, "iTWT suspended by AP"); + break; + default: + break; + } +} + +static bool s_handler_installed = false; + +static void install_event_handler_once(void) +{ + if (s_handler_installed) return; + esp_err_t e = esp_event_handler_instance_register( + WIFI_EVENT, ESP_EVENT_ANY_ID, on_itwt_event, NULL, NULL); + if (e == ESP_OK) { + s_handler_installed = true; + } else { + ESP_LOGW(TAG, "Could not install iTWT event handler: %s", + esp_err_to_name(e)); + } +} + +esp_err_t c6_twt_setup(uint32_t wake_interval_us, uint32_t min_wake_dura_us) +{ + install_event_handler_once(); + + s_wake_int = wake_interval_us; + s_wake_dura = min_wake_dura_us < 256 ? 256 : min_wake_dura_us; + + wifi_itwt_setup_config_t cfg = {0}; + cfg.setup_cmd = TWT_REQUEST; + cfg.flow_id = s_flow_id; + cfg.twt_id = 0; + cfg.flow_type = 1; /* unannounced */ + cfg.min_wake_dura = (uint8_t)((s_wake_dura + 255) / 256); /* 256 µs units */ + cfg.wake_duration_unit = 0; /* 0 = 256 µs, 1 = 1024 µs */ + cfg.wake_invl_expn = 10; /* mantissa * 2^10 ≈ 1024 µs base */ + /* mantissa = wake_interval_us / 1024, clamped to uint16 */ + uint32_t mant = wake_interval_us >> 10; + if (mant == 0) mant = 1; + if (mant > 0xFFFF) mant = 0xFFFF; + cfg.wake_invl_mant = (uint16_t)mant; + cfg.trigger = 0; /* non-triggered: STA wakes on its own */ + + esp_err_t ret = esp_wifi_sta_itwt_setup(&cfg); + if (ret == ESP_OK) { + ESP_LOGI(TAG, "iTWT setup queued: wake_interval=%lu µs (mant=%u expn=10), " + "min_wake_dura=%u (%lu µs)", + (unsigned long)wake_interval_us, (unsigned)mant, + cfg.min_wake_dura, (unsigned long)s_wake_dura); + return ESP_OK; + } + /* Treat AP-rejection / not-supported / wrong-AP-mode as graceful — log + * and continue. ESP_ERR_INVALID_ARG is included here because empirically + * (live capture on ruv.net 2026-05-22) the ESP-IDF v5.4 driver returns + * INVALID_ARG when the associated AP advertises TWT Responder=0 — the + * call validates against the AP's HE capability bitmap, not just the + * struct fields. */ + if (ret == ESP_ERR_NOT_SUPPORTED || ret == ESP_ERR_WIFI_NOT_CONNECT || + ret == ESP_ERR_INVALID_STATE || ret == ESP_ERR_INVALID_ARG) { + ESP_LOGW(TAG, "iTWT not available (%s) - AP likely not 11ax/iTWT capable," + " falling back to opportunistic CSI", + esp_err_to_name(ret)); + return ESP_OK; + } + ESP_LOGE(TAG, "iTWT setup failed: %s", esp_err_to_name(ret)); + return ret; +} + +esp_err_t c6_twt_setup_default(void) +{ + return c6_twt_setup(CONFIG_C6_TWT_WAKE_INTERVAL_US, + CONFIG_C6_TWT_MIN_WAKE_DURA_US); +} + +void c6_twt_teardown(void) +{ + if (!s_active) return; + /* IDF v5.4 signature: esp_err_t esp_wifi_sta_itwt_teardown(int flow_id) */ + esp_err_t ret = esp_wifi_sta_itwt_teardown((int)s_flow_id); + if (ret == ESP_OK) { + ESP_LOGI(TAG, "iTWT teardown sent (flow_id=%u)", s_flow_id); + } else { + ESP_LOGW(TAG, "iTWT teardown failed: %s", esp_err_to_name(ret)); + } + s_active = false; +} + +bool c6_twt_is_active(void) +{ + return s_active; +} + +#endif /* CONFIG_IDF_TARGET_ESP32C6 && SOC_WIFI_HE_SUPPORT */ diff --git a/firmware/esp32-csi-node/main/c6_twt.h b/firmware/esp32-csi-node/main/c6_twt.h new file mode 100644 index 00000000..35b84823 --- /dev/null +++ b/firmware/esp32-csi-node/main/c6_twt.h @@ -0,0 +1,75 @@ +/** + * @file c6_twt.h + * @brief ESP32-C6 TWT (Target Wake Time) helper — ADR-110 Phase 3. + * + * Wraps esp_wifi_sta_itwt_setup() to negotiate a deterministic wake slot + * with the AP, replacing today's opportunistic CSI capture cadence with + * a scheduler-bounded one. + * + * Only built when CONFIG_IDF_TARGET_ESP32C6 is set — the S3 radio is + * 802.11n only and cannot speak iTWT. + * + * Usage from main.c (after WiFi STA is connected): + * c6_twt_setup_default(); // honors CONFIG_C6_TWT_WAKE_INTERVAL_US + * + * Graceful failure: if the AP rejects (no 11ax support, doesn't allow + * iTWT, or returns a NACK), the helper logs and returns ESP_OK — the + * device keeps doing opportunistic CSI just like the S3. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "soc/soc_caps.h" + +#if defined(CONFIG_IDF_TARGET_ESP32C6) && SOC_WIFI_HE_SUPPORT + +#include "esp_err.h" +#include +#include + +/** + * Set up an individual TWT agreement using the Kconfig defaults + * (CONFIG_C6_TWT_WAKE_INTERVAL_US, CONFIG_C6_TWT_MIN_WAKE_DURA_US). + * + * @return ESP_OK whether or not the AP accepted — the helper never + * propagates a TWT NACK as an error to the caller. + */ +esp_err_t c6_twt_setup_default(void); + +/** + * Set up an individual TWT agreement with explicit parameters. + * + * @param wake_interval_us Period between wake events. + * @param min_wake_dura_us Minimum awake duration per wake (≥256 µs). + * @return ESP_OK on success or graceful NACK; ESP_FAIL on local error. + */ +esp_err_t c6_twt_setup(uint32_t wake_interval_us, uint32_t min_wake_dura_us); + +/** + * Tear down any active TWT agreement. Safe to call when none is active. + * Should be invoked on WIFI_EVENT_STA_DISCONNECTED so the AP scheduler + * doesn't keep a dead slot reserved. + */ +void c6_twt_teardown(void); + +/** + * Returns true if a TWT agreement is currently active. + */ +bool c6_twt_is_active(void); + +#else /* not C6 with iTWT support — provide stubs so call sites compile */ + +static inline esp_err_t c6_twt_setup_default(void) { return ESP_OK; } +static inline esp_err_t c6_twt_setup(uint32_t a, uint32_t b) { (void)a; (void)b; return ESP_OK; } +static inline void c6_twt_teardown(void) { } +static inline bool c6_twt_is_active(void) { return false; } + +#endif /* CONFIG_IDF_TARGET_ESP32C6 && SOC_WIFI_HE_SUPPORT */ + +#ifdef __cplusplus +} +#endif diff --git a/firmware/esp32-csi-node/main/csi_collector.c b/firmware/esp32-csi-node/main/csi_collector.c index 3c59de86..484b40cc 100644 --- a/firmware/esp32-csi-node/main/csi_collector.c +++ b/firmware/esp32-csi-node/main/csi_collector.c @@ -15,6 +15,8 @@ #include "nvs_config.h" #include "stream_sender.h" #include "edge_processing.h" +#include "c6_timesync.h" /* ADR-110: 802.15.4 epoch for cross-node alignment */ +#include "c6_sync_espnow.h" /* ADR-110 §A0.11: mesh-aligned epoch for sync packet */ #include #include "esp_log.h" @@ -173,9 +175,64 @@ size_t csi_serialize_frame(const wifi_csi_info_t *info, uint8_t *buf, size_t buf /* Noise floor (i8) */ buf[17] = (uint8_t)(int8_t)info->rx_ctrl.noise_floor; - /* Reserved */ + /* ADR-110: PPDU type (byte 18) + bandwidth/flags (byte 19). + * Previously reserved-zero, now optionally populated when CONFIG_CSI_FRAME_HE_TAGGING. + * Readers that don't know about the extension see zeros — backward compatible. + * + * The struct that backs info->rx_ctrl is target-conditional in IDF v5.4 + * (esp_wifi/include/local/esp_wifi_types_native.h): + * + * CONFIG_SOC_WIFI_HE_SUPPORT=y (C6/C5) → esp_wifi_rxctrl_t with cur_bb_format, second + * otherwise (S3 etc) → legacy struct with sig_mode, cwb, stbc + * + * Byte-18 PPDU type encoding stays the same across targets: + * 0=HT/legacy bucket, 1=HE-SU, 2=HE-MU, 3=HE-TB, 0xFF=unknown + */ +#ifdef CONFIG_CSI_FRAME_HE_TAGGING + uint8_t ppdu_type = 0xFF; + uint8_t flags = 0; +#if CONFIG_SOC_WIFI_HE_SUPPORT + /* HE-capable chips: read cur_bb_format (0=11b, 1=11g, 2=HT, 3=VHT, 4=HE-SU, + * 5=HE-MU, 6=HE-ERSU, 7=HE-TB) and 'second' (40 MHz secondary chan offset). */ + switch (info->rx_ctrl.cur_bb_format) { + case 0: + case 1: + case 2: ppdu_type = 0; break; /* 11b/g/a/HT bucket */ + case 3: ppdu_type = 0; break; /* VHT — rare on 2.4 GHz, HT bucket */ + case 4: ppdu_type = 1; break; /* HE-SU */ + case 5: ppdu_type = 2; break; /* HE-MU */ + case 6: ppdu_type = 1; break; /* HE-ER-SU collapses to HE-SU */ + case 7: ppdu_type = 3; break; /* HE-TB */ + default: ppdu_type = 0xFF; break; + } + if (info->rx_ctrl.second != 0) flags |= 0x1; /* bw 40 MHz */ +#else + /* Pre-HE chips (S3 etc): use legacy sig_mode + cwb + stbc fields. */ + switch (info->rx_ctrl.sig_mode) { + case 0: ppdu_type = 0; break; /* non-HT (11b/g) */ + case 1: ppdu_type = 0; break; /* HT (11n) */ + case 3: ppdu_type = 0; break; /* VHT — bucket as HT for storage */ + default: ppdu_type = 0xFF; break; + } + if (info->rx_ctrl.cwb) flags |= 0x1; /* bw 40 MHz */ + if (info->rx_ctrl.stbc) flags |= (1 << 2); /* STBC */ +#endif /* CONFIG_SOC_WIFI_HE_SUPPORT */ + /* ADR-018 byte 19 bit 4 = "cross-node sync valid". Two transports can + * set it: the original 802.15.4 c6_timesync (broken in IDF v5.4 — D1) + * and the ESP-NOW workaround c6_sync_espnow (measured working in §A0.7- + * §A0.10). OR them together so frames signal sync from whichever + * transport is alive on this node. Host can pair against the sync + * packet (§A0.12) once it sees this bit. */ +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_C6_TIMESYNC_ENABLE) + if (c6_timesync_is_valid()) flags |= (1 << 4); /* 15.4 sync valid */ +#endif + if (c6_sync_espnow_is_valid()) flags |= (1 << 4); /* ESP-NOW sync valid (D1 workaround) */ + buf[18] = ppdu_type; + buf[19] = flags; +#else buf[18] = 0; buf[19] = 0; +#endif /* I/Q data */ memcpy(&buf[CSI_HEADER_SIZE], info->buf, iq_len); @@ -245,6 +302,56 @@ static void wifi_csi_callback(void *ctx, wifi_csi_info_t *info) edge_enqueue_csi((const uint8_t *)info->buf, (uint16_t)info->len, (int8_t)info->rx_ctrl.rssi, info->rx_ctrl.channel); } + + /* ADR-110 §A0.11/§A0.12 — Emit a sync-packet every N CSI frames so the + * host aggregator can pair node-local sequence numbers with the mesh-aligned + * epoch coming out of c6_sync_espnow_get_epoch_us(). Backwards-compatible + * with the ADR-018 frame format: new packet uses a distinct magic so the + * existing CSI parser can dispatch by first 4 bytes. + * + * Cadence is operator-tunable via CONFIG_C6_SYNC_EVERY_N_FRAMES (default 20). + * At 10 Hz observed CSI rate that's ~2 s between sync packets; raise to 50 + * for ~5 s (less overhead, slower convergence), lower to 5 for ~0.5 s + * (heavier wire, tighter ADR-029/030 multistatic alignment window). */ + { +#ifndef CONFIG_C6_SYNC_EVERY_N_FRAMES +#define CONFIG_C6_SYNC_EVERY_N_FRAMES 20 +#endif + if ((s_cb_count % CONFIG_C6_SYNC_EVERY_N_FRAMES) == 0) { + uint8_t sync[32]; + uint32_t sync_magic = 0xC511A110u; /* CSI-ADR-110 sync packet */ + uint64_t local_us = (uint64_t)esp_timer_get_time(); + uint64_t epoch_us = c6_sync_espnow_get_epoch_us(); + int64_t off_smooth = c6_sync_espnow_get_offset_us_smoothed(); + uint8_t flags = 0; + if (c6_sync_espnow_is_leader()) flags |= 0x01; + if (c6_sync_espnow_is_valid()) flags |= 0x02; + if (off_smooth != 0) flags |= 0x04; + + memcpy(&sync[0], &sync_magic, 4); + sync[4] = s_node_id; + sync[5] = 0x01; /* protocol version */ + sync[6] = flags; + sync[7] = 0; /* reserved */ + memcpy(&sync[8], &local_us, 8); + memcpy(&sync[16], &epoch_us, 8); + memcpy(&sync[24], &s_sequence, 4); /* high-water seq for pairing */ + uint32_t zero32 = 0; + memcpy(&sync[28], &zero32, 4); /* reserved (room for leader_id low32) */ + int sr = stream_sender_send(sync, sizeof(sync)); + static uint32_t s_sync_count = 0; + s_sync_count++; + if (s_sync_count <= 3 || (s_sync_count % 60) == 0) { + ESP_LOGI(TAG, "sync-pkt #%lu (sr=%d) node=%u flags=0x%02x " + "local_us=%llu epoch_us=%llu seq=%lu", + (unsigned long)s_sync_count, sr, + (unsigned)s_node_id, (unsigned)flags, + (unsigned long long)local_us, + (unsigned long long)epoch_us, + (unsigned long)s_sequence); + } + } + } } /** diff --git a/firmware/esp32-csi-node/main/lp_core/CMakeLists.txt b/firmware/esp32-csi-node/main/lp_core/CMakeLists.txt new file mode 100644 index 00000000..6e799242 --- /dev/null +++ b/firmware/esp32-csi-node/main/lp_core/CMakeLists.txt @@ -0,0 +1,9 @@ +# LP-core motion-gate program — ADR-110 Phase 5 (full). +# +# Built only when CONFIG_C6_LP_CORE_ENABLE=y (gated in the parent CMakeLists). +# The IDF build system invokes this via `ulp_embed_binary()` from +# main/CMakeLists.txt. + +# This file intentionally has no idf_component_register — the LP-core sources +# are compiled with the RISC-V LP toolchain via `ulp_embed_binary` and then +# linked into the HP image as a binary blob, not as a normal component. diff --git a/firmware/esp32-csi-node/main/lp_core/main.c b/firmware/esp32-csi-node/main/lp_core/main.c new file mode 100644 index 00000000..4150812c --- /dev/null +++ b/firmware/esp32-csi-node/main/lp_core/main.c @@ -0,0 +1,75 @@ +/** + * @file lp_core/main.c + * @brief LP RISC-V coprocessor motion-gate — ADR-110 Phase 5 (full). + * + * Polls a single LP-IO GPIO at LP_TIMER cadence (default 10 ms / 100 Hz), + * debounces N consecutive samples, and wakes the HP core when a confirmed + * transition matches the configured active-edge polarity. Counter + + * last-level are exported as shared symbols so the HP side can inspect + * them on wake. + * + * Shared symbols (HP-visible as `ulp_` after `ulp_embed_binary`): + * - wake_gpio_num (input) : LP-IO index 0..7 on ESP32-C6 + * - wake_active_high (input) : 1 = wake on rising stable, 0 = falling + * - debounce_samples (input) : consecutive matches required, default 3 + * - motion_count (output) : monotonic wake-trigger counter + * - last_gpio_level (output) : level latched at the most recent wake + * - poll_count (output) : total LP-timer ticks observed (sanity) + * + * Defaults are written by HP via the `ulp_*` symbols before `ulp_lp_core_run()`, + * so the program is parameterised at boot without recompiling the LP binary. + */ + +#include +#include +#include "ulp_lp_core.h" +#include "ulp_lp_core_utils.h" +#include "ulp_lp_core_gpio.h" + +/* --- Shared (HP/LP) state --- */ +volatile uint32_t wake_gpio_num = 4; /* LP-IO 4 by default */ +volatile uint32_t wake_active_high = 1; /* rising edge */ +volatile uint32_t debounce_samples = 3; +volatile uint32_t motion_count = 0; +volatile uint32_t last_gpio_level = 0; +volatile uint32_t poll_count = 0; + +/* --- Local state (persists across LP-timer wake cycles via .data) --- */ +static uint32_t stable_run = 0; +static uint32_t prev_level = 0; + +int main(void) +{ + poll_count++; + + /* LP-IO read returns 0/1 directly. The Kconfig-selected GPIO index maps + * 1:1 to LP_IO on C6 for indices 0..7. */ + uint32_t level = (uint32_t)ulp_lp_core_gpio_get_level((lp_io_num_t)wake_gpio_num); + + if (level == prev_level) { + if (stable_run < 0xFFFFu) stable_run++; + } else { + stable_run = 1; + prev_level = level; + } + + /* Trigger when level matches the configured active polarity AND has been + * stable for `debounce_samples` consecutive reads. After firing, hold off + * until level returns to the inactive state to avoid re-triggering on + * the same continuous edge. */ + static uint32_t armed = 1; + uint32_t want = wake_active_high ? 1 : 0; + + if (armed && level == want && stable_run >= debounce_samples) { + motion_count++; + last_gpio_level = level; + armed = 0; + ulp_lp_core_wakeup_main_processor(); + } else if (!armed && level != want && stable_run >= debounce_samples) { + /* Re-arm once the line has cleanly returned to the inactive state. */ + armed = 1; + } + + /* ulp_lp_core_halt() is called automatically when main returns. */ + return 0; +} diff --git a/firmware/esp32-csi-node/main/main.c b/firmware/esp32-csi-node/main/main.c index 0f6662f9..ef576890 100644 --- a/firmware/esp32-csi-node/main/main.c +++ b/firmware/esp32-csi-node/main/main.c @@ -33,6 +33,11 @@ #include "swarm_bridge.h" #include "rv_radio_ops.h" /* ADR-081 Layer 1 — Radio Abstraction Layer. */ #include "adaptive_controller.h" /* ADR-081 Layer 2 — Adaptive controller. */ +#include "c6_twt.h" /* ADR-110: TWT (no-op stub on S3) */ +#include "c6_timesync.h" /* ADR-110: 802.15.4 mesh time-sync (no-op on S3) */ +#include "c6_lp_core.h" /* ADR-110: LP-core hibernation (no-op on S3) */ +#include "c6_sync_espnow.h" /* ADR-110 D1 workaround: ESP-NOW sync */ +#include "c6_softap_he.h" /* ADR-110 B1/B2: HE/TWT soft-AP (no-op when disabled) */ #ifdef CONFIG_CSI_MOCK_ENABLED #include "mock_csi.h" #endif @@ -112,6 +117,17 @@ static void wifi_init_sta(void) ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); + +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_C6_SOFTAP_HE_ENABLE) + /* ADR-110 B1/B2 cheap-unblock: bring up a soft-AP that advertises HE + + * TWT Responder=1 so a second C6 board can negotiate iTWT against + * this node. c6_softap_he_start() switches the mode to AP+STA. */ + uint8_t softap_chan = 0; + if (c6_softap_he_start(&softap_chan) == ESP_OK) { + ESP_LOGI(TAG, "C6 soft-AP HE armed on channel %u (ADR-110 B1/B2)", softap_chan); + } +#endif + ESP_ERROR_CHECK(esp_wifi_start()); ESP_LOGI(TAG, "WiFi STA initialized, connecting to SSID: %s", g_nvs_config.wifi_ssid); @@ -147,13 +163,27 @@ void app_main(void) csi_collector_set_node_id(g_nvs_config.node_id); const esp_app_desc_t *app_desc = esp_app_get_description(); - ESP_LOGI(TAG, "ESP32-S3 CSI Node (ADR-018) — v%s — Node ID: %d", - app_desc->version, g_nvs_config.node_id); +#if defined(CONFIG_IDF_TARGET_ESP32C6) + const char *target_name = "ESP32-C6"; +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + const char *target_name = "ESP32-S3"; +#else + const char *target_name = "ESP32"; +#endif + ESP_LOGI(TAG, "%s CSI Node (ADR-018 / ADR-110) — v%s — Node ID: %d", + target_name, app_desc->version, g_nvs_config.node_id); - /* Turn off onboard WS2812 LED on GPIO 38 */ + /* Turn off onboard WS2812 LED. + * S3 dev boards put the LED on GPIO 38; C6 dev boards on GPIO 8. + * On C6, GPIO 38 doesn't exist (only 0-30) — gate the init by target. */ +#if defined(CONFIG_IDF_TARGET_ESP32C6) + const int led_gpio = 8; +#else + const int led_gpio = 38; +#endif led_strip_handle_t led_strip; led_strip_config_t strip_config = { - .strip_gpio_num = 38, + .strip_gpio_num = led_gpio, .max_leds = 1, .led_model = LED_MODEL_WS2812, .color_component_format = LED_STRIP_COLOR_COMPONENT_FMT_GRB, @@ -167,6 +197,27 @@ void app_main(void) led_strip_clear(led_strip); } + /* ADR-110 P4: 802.15.4 mesh time-sync (C6 only). + * Initialized BEFORE WiFi so it's available even when WiFi STA can't + * connect — the radios are physically independent on the C6. + * No-op on S3 (the helper compiles to an empty inline stub). */ +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_C6_TIMESYNC_ENABLE) + esp_err_t ts_ret = c6_timesync_init(CONFIG_C6_TIMESYNC_CHANNEL); + if (ts_ret != ESP_OK) { + ESP_LOGW(TAG, "c6_timesync_init failed: %s (continuing without 15.4 sync)", + esp_err_to_name(ts_ret)); + } +#endif + + /* ADR-110 P5: Optionally arm LP-core wake-on-motion (C6 only, opt-in). + * Default off — only nodes flashed for battery-powered seed duty enable + * this in menuconfig. */ +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_C6_LP_CORE_ENABLE) + if (c6_lp_core_was_motion_wake()) { + ESP_LOGI(TAG, "boot cause: LP-core motion wake (running CSI burst)"); + } +#endif + /* Initialize WiFi STA (skip entirely under QEMU mock — no RF hardware) */ #ifndef CONFIG_CSI_MOCK_SKIP_WIFI_CONNECT wifi_init_sta(); @@ -208,6 +259,26 @@ void app_main(void) } #endif + /* ADR-110 P3: Request TWT from the AP for deterministic CSI cadence. + * No-op on S3 (the helper compiles to an empty inline stub). On C6 + * the AP may NACK — the helper logs and falls back to opportunistic. + * Called only after WiFi STA connect (wifi_init_sta blocks until then). */ +#if defined(CONFIG_IDF_TARGET_ESP32C6) && defined(CONFIG_C6_TWT_ENABLE) + c6_twt_setup_default(); +#endif + + /* ADR-110 D1 workaround: ESP-NOW cross-node sync. Initialized after + * WiFi STA connects (ESP-NOW needs the WiFi driver up). Works on + * both S3 and C6 — replaces the broken 802.15.4 RX path in c6_timesync. + * Skip on QEMU mock (no real WiFi → no ESP-NOW). */ +#ifndef CONFIG_CSI_MOCK_SKIP_WIFI_CONNECT + esp_err_t espnow_ret = c6_sync_espnow_init(); + if (espnow_ret != ESP_OK) { + ESP_LOGW(TAG, "c6_sync_espnow_init failed: %s (continuing without ESP-NOW sync)", + esp_err_to_name(espnow_ret)); + } +#endif + /* ADR-039: Initialize edge processing pipeline. */ edge_config_t edge_cfg = { .tier = g_nvs_config.edge_tier, diff --git a/firmware/esp32-csi-node/main/swarm_bridge.c b/firmware/esp32-csi-node/main/swarm_bridge.c index b6b485b2..3c5a19d9 100644 --- a/firmware/esp32-csi-node/main/swarm_bridge.c +++ b/firmware/esp32-csi-node/main/swarm_bridge.c @@ -230,9 +230,13 @@ static void swarm_task(void *arg) ESP_LOGI(TAG, "Bearer token configured for Seed auth"); } - /* Get firmware version string. */ + /* Firmware version + IP captured locally so logs name the build; both + * intentionally unused in the JSON payloads — the seed extracts them + * from the register/heartbeat IDs. Keep as side-effect probes. */ const esp_app_desc_t *app = esp_app_get_description(); - const char *fw_ver = app ? app->version : "unknown"; + if (app) { + ESP_LOGI(TAG, "swarm bridge fw=%s", app->version); + } /* Get local IP. */ char ip_str[16]; @@ -278,15 +282,12 @@ static void swarm_task(void *arg) xSemaphoreGive(s_mutex); uint32_t uptime_s = (uint32_t)(esp_timer_get_time() / 1000000ULL); - uint32_t free_heap = esp_get_free_heap_size(); uint32_t ts = (uint32_t)(esp_timer_get_time() / 1000ULL); /* ---- Heartbeat ---- */ if ((now - last_heartbeat) >= pdMS_TO_TICKS(s_cfg.heartbeat_sec * 1000U)) { last_heartbeat = now; - bool presence = vit_valid && (vit.flags & 0x01); - /* Heartbeat ID: node_id * 1000000 + 100000 + ts_sec */ uint32_t hb_id = (uint32_t)s_node_id * 1000000U + 100000U + (uptime_s % 100000U); char json[SWARM_JSON_BUF]; diff --git a/firmware/esp32-csi-node/release_bins/c6-adr110/SHA256SUMS.txt b/firmware/esp32-csi-node/release_bins/c6-adr110/SHA256SUMS.txt new file mode 100644 index 00000000..e80d3351 --- /dev/null +++ b/firmware/esp32-csi-node/release_bins/c6-adr110/SHA256SUMS.txt @@ -0,0 +1,4 @@ +889715e9d698ad78f9978ad8b93b6af24a726b0494247201c8f0d920d9fc80ca *firmware/esp32-csi-node/release_bins/c6-adr110/bootloader.bin +d8539e47c6f10a3344679118619e3fe01cfd66eb560ea8883268ca7c9a12efa4 *firmware/esp32-csi-node/release_bins/c6-adr110/esp32-csi-node.bin +7d2c7ac4888bfd75cd5f56e8d61f69595121183afc81556c876732fd3782c62f *firmware/esp32-csi-node/release_bins/c6-adr110/ota_data_initial.bin +4c2cc4ffd52641e23b779bd57b3908014083ac3c1aab395756478c89e70d81f0 *firmware/esp32-csi-node/release_bins/c6-adr110/partition-table.bin diff --git a/firmware/esp32-csi-node/release_bins/c6-adr110/bootloader.bin b/firmware/esp32-csi-node/release_bins/c6-adr110/bootloader.bin new file mode 100644 index 0000000000000000000000000000000000000000..eede7dfdb82865b29cf617e854a336d62015d3ab GIT binary patch literal 19568 zcmbt*3tSUd*7%(ylSx1n42bUH?f{C)TB}4z)ryIb%mTg_w6?lD#(->jKSX!SmY57N zDuRs`Y;}v)isfs&TUeX6Tgy{Ww1}>X?b;U0Dxcl8p%z4}$p74##6;TNZ}<22_ru&d zbMCq4o_k*R+&j0#BHFvDRQ(M?$P4}ui~mCez0R!urw>A_@B{okF)!??CswSC*R4!g z5e?5{|1D46Mu&ybVROSG=y?kk&YQPzu5v66|2)n!X%zlx^7Hk11$1h1dWL=zot{Nc z&z}u{3#V_QXHL(b<>dj$$tl@+1v6*SMalUzo1B3WlMCooQS{uc)8{_5mB&fR&Mv@o zwa_i2a26&(XJjXDqH~h-3epSGv$N=eMknXwxX4V;=li;kpUlr=-NA(g=^5z-+vf1A@1nPOF(&9f4`2qyO3ii&hR#p_ zt)2$qW3d)wXVdwauvYZU%=E1E%)(5VBAv1gL^SIM@^fP=Gc!47Cd?;e>ufx&jIFaA zs)0MXkN+cmgf4D9-0^jSf)!-bTl9J9soUK6=GT5KeV8B3OWUPC=~-KnGtxKB297c^ z(zDX&lw|gKm?=E-dh&yL{c9R@a@HnLJ!j9^bWu8pssQU6{5~2IRLy-3E3zM{D$VQK zBSfqu1)KG*o`SLiN9)||K{tl)NBRnOm7SHb%|-nY;UCP&orlNlBL83WkeZR4zc~@p z%ztb?k4C||;gBx<1f89lny)VqmS0dRUK42jR#vayluz^IXm)dYj@#R@>$eim2h^Tk z9vu$2diMEz&_U2lkU@5le$!a|m@GCsFHg@FJl5fH`Tr=tnaOGCES*)DnWE2gSfcxy zx%vq1XEVqe7QR5A2X+Bg3~B_XnYV2=?}>N?<7KYT+BA=jr1J|vYV-a>TTahnGYU89 z$J+Cp&Cnm{g*oYA-;fPvkdd5|&#$@Q6YyZ{^Z()a1raXOqKAo4G zl?I+upP!SM4zj>b)P4SLb}Fbro*pPT+&y@4SlYQyW$^Cnv3^c<$k(T3f`I4@eO6k* zW&uAR%aQ}qSxX5PPU(&w{z={daP-wZ?Q9X{Wkw_iDEgZ4c(B?nKl=}p=C{Hz%T zbY?Op%ew=2esQNn5G=@*Z(@;P8U3ez_mRvJQ?v764D5CP1%LdoTb~eqoVKzMqTE<>qUS{{U;4Nm2xAC~2fgqp z&gBxU0sDD+CWO|_SikvohnT%tpQm4fy}$b$$Ix;vH=A7uiw+CpH2Tcst?>9bA5l)T z7Sw4D9hIEH7G@+Dz+f<;tu(J|xb=9y7_6sGjlu!Txz4HS1uzpgFY3@bz`=5MBM)=l z{MbAMni%X%9I8OBDq z+j{=yWFcw8={|HObd^o^Z%uukEIW)k3r5cuxYsu z!awt)VE-}4fsMy>*Byr!DcY>hqVo!~vaqr}vph<0nuR%_c-cj>K?yJoobkEG!c}Wl z(ow4tc;!veV*+{{bW*m_>!Rc5cp%&-5mKkjF=GnroTtw%Ootw{KD97kPp4!&5B;~$ zk&Edqpeu9WZ#JD$SRe!`Pyi?N$Mo=D&;nsQd;KT0GSea5!d{Axi!sr&!Ezj$HXWxd zU{9NP1N!&#;d?)t%BDHE@8c7}urW3~MkbGF@Kg9VG*SvvQ^Cvp*ShZ(Qy}_m%FYBe za)a^yW~{Chx-;sA!cpozV3Epu+l9`r;J@$V<1E<{oAN?Up@*#LD&;8i(Gqdy46Tt;y!&gGm z@SpgTv2z`}!Qce|>jnCn?M|D2#?w!PR0rL~B-46&{@mri{OuTDP?+V|S%S5>#$&UyQq$84g>5T8uDfo>2pcQ zf}1GhYB@RXJ_GN2`99fM`H7C)7zsN?2fmQ*>hpmQ*J30>%nb{VNK6IM^WpqQ-U*qr zTc6}Ch;@aqiBBxrQ~-lQ+<{1g1@t&=emULxrNSODQE+&V@!;|)iTSCUa(?8Ueyg4> z1k=Lt3>+r^o1KLmG7_o_naTN}L76!j2;n+V)i{La@VMgLRZ zfbr%AS*fn!(6(N3@IIjx-X-0t18VlU-g8xH@+1XCp$#huAI+A?wmL>3y*okL`E9wi zk6MMFgU%VWq;|u3p=aawoOTW;v=OwO6dOm~;G?!7k0h&^LRBkCts;#MYDH#-{SbZyT>NHYqAmNhPT8)vN7SqY}!mw%BHPCaIXKtKfaJg7UAeYEc11LA5ve zMqSwB+Y($&p+mD(P&2c^A8?)wn0f4-K9MaIq_D-Tww9LqD5Rx3tYjml(gO~uodh$D zbnBC6HJgjrkv`<=)8;Sq>7u^1-I%7GId4|rEW5hP!>(@34xDDE>8+tAuTvoJ`5glxQ+}d&%`_p{C4XA|%vQIQV%`sHyl{0jKAJ-tSF@?W+-4 zsT^&6cMalpaV>V*`^m9XwLf#n`@9WS2#g$4a@%y{Ix9!2mzOVWQ&DQfTKkYecZ5+<6{E%e!{ryHm&+qt?dpp87&ZVf zML{?kE?4+XBhHkosBtK=br^nSd`~hO=I5sjuSQC;TAjW-NNa;WBmQ+-uN|?H;xbKH zXe${kKWkf^ILM006 z&}eSijwV|;U~*jZ4$U2PN;HP-j=C8AZQ1S?8--~wlXgdC?x|?0i28QVK3>B>o-O;L zR8pkAfFY9rt5nxov2^{Oie_5`erjtLp7w!OR<+V3IW21JcgIdK$+aF5X>~!_7 z>eRBvplA)Ty+q?fYNc&Kts%{Jx+K|7s}l`6LTAt_$Z8585jM#VwfK$JhpKqc8;L2$ zu}+OZCEUo&N7lX}^g1zs?DU^9Ensh;cfY}KFXpgzuaVu=hgfz3ydrzG zn4TupO5GimX%rOl=29<`4n1oiwHBa3r`zfNv^sTA^h?o%7W3)DShT(S`W`fC&)Bff z;H^kX@>ZlQZC7KC$z=biZKG*O+;0O6jSr_w)`5I;K*wO#t2ACsKvnGUJG>oWzoXqO zj9q=SIH680$OPl73+;5z7CaWF&E>!hC)TN*`hf8WA7QPjMh{Nf8QC0kPSog-Pq#tq z;qW%}RcA|mMUbrr_wFz3>bX>?$@wPfl48<)6!h|5kh~MtbJ5vCe|5I#iyY{>&5W>R zp_wSM%`slrOk{BQNczG|BtX^Yv0h;vfMRS0<`>(V@UG-#r=`)a056N-Phw*xAfP)< zDH#;0v_A__kb_^Ubnq*c_84?Q`|HCw2W5KplMh@<0X|)Ct`SX?j1(&42Shds zcq^sQ)mY47X1QXLgjl_Ob@|nftFbDn_vqps#go=Za?3RUQTbyJNvV5x_1(9ng10D@ zqN_`b{cL{yqYK-@7)9aWgb}|mGP67eEIN$2+AOXy%ds~JeydN0+vKjyQRf^rK3I=o zd|7@4brSQzQPBDbEN)!BxBp4_rAZ1}AA$XN=X-~o%&(a7kxfT<=T}6W%=cD(WFu*4 zYXQzcI|$kd0AB~~5@_oIo(AnkXcq#!2-?Uuzk&m}`6HVjZtn+pC5BJVuXqFCHPDto z`vkykm=kref4+A+ylMXkIP@6t2M!lmsebu)HPpgUTA& zh1gcHO}OY;(zFd5bFn8YZ9CF>ta(mbXe-uY*eSZb?WHyN!)!$7; z5M}>*Z{>*Z+XhVW-ud_AJ|hq5lxY<4{#n7Fnl)8X3v>#yOR6vb6ufL5LofzynbA5l zGy#0wOcn47c?8w2@r}A{{EWJ>=W=;K%T(sWQjYQCePWl?PNR^i(Cfp}g#g90z)MW? z3#v8k4OK}!lYG~zKm#G#?6FqnDB9rpg--C)@`Fo<%g>Y_ zYz9l@*Q+EsgtM!?MXubYX^XY=?u5wBJB-YGP{?ecz2UrFU7ZsYJ#KPcd|-*9U|>lQ z^rKh$L0;7p?jDibo>!2kG6d??YwdICMY73&`K$ct^zXr%MIogIos#54f<85VlkYwK z_c%7@KvYyw-iWR26Y)NMHvT^;EJzz;@UlQ_agcVkVJftGl<%oSqF;_q1}~$c<|1}~ zAA{}w|O$8DQbjmRAdd|N89aVRO5Zv)Q#;zOJxjYr1qx1`U@L6i8ITp^wB$fuST94?gccuLitw9Wzime*=RTK@`;rF@a za-Zx9t6;Hq!2146x)F`?IT1+E$Z=Xc5jzhq~1gjKDtVM$p z*h$^!gumiMAKG4Gm3m9?^BeG7!#^XE(6avB=xu<^00^PoUa}xJvQ7F$(6x}yVy~{a zvgXp-i?G)bJ)XhqRx6}!yR9TWO~~LcC)mAve%EYbM<~LTvrE?rSaYY{YEaFGHK8QP zSZhY&S~FpMvz-vXNr{4wQb>HKUe?m?H2uYkizhfo%+Q#C^ z%0iMjQ?~njSBv2^&J>L`?GKIZmBhy{2P^|!=ut*=p%K3=(%a=1$^*`AST-`rdiSo_ zIz&CVT)yF4z%tPOd-V}LsCd#h(r?SbXPz_YMF4r@^a+HbdogM>Mb{H077Dd{v` zw>4UJ#{e2xS6^9)tnEXi#btL^rNm#1U%I|-ebBQnJsSwR_VlvZvdDASZSR=F%n>^v zD~1?w`!9q~>}i!8vf}Ay9!<*lCzbIh%Xs0g0+0w=6r7?9e zL9s8zisA?@&JS(U(}(l3{`y%}!xCkea`u)|vik_PLqQ-4}6%yC=U#xfzo1huMQk7JzC3VWj+ zQMV#|P7zvXHp6K(+P76W55+pu>pS?+;25F8^S1I)n;Kr^Z1+z%vq(Xr;!0lfJxqA4`5ch~JeHwNo>m7Ir#R-QRY%@?&)k^S=y=)LP5IjvaP6f<`np9O3j@p^c!u&CynWe1uDOv`bDN;c^}A z#*dD0LD6;Ubl7S62jd;o>wj@oLWDYqm8y`ko`W*>n;K-LyrrysP->-;Fib>f72$r^ zZ&KA#mKc;k-A39wY49P=y2Ni#+qpEHSrwN-u1G*8*${Z#`6kkgVTwYM2KZ3$oS~A9 z4L^A24e!3cZ2JLR4RHInkKi26UrU5h@Obd{%VNkn@ZL7IQQ8)22{XNCny#|7izWkR zPi^H+sw&DlDGl|0B7GPnQEr+>G)uI*A%7#*?=FED0x!(+{befc(pR99{#OFR^0!V7lqq@ULA#2hTNB!oM8P|608 zhs-!bh7^^+$1)1@p$A_^A4l%ckp%oyUp1ZJB=!6DBkSpVqny0SSbwt$)$b1{M)p|S z2S@9N7y>-*g!;-E#AS$lqo|p}877|5r{%%)y~k)i?g_9L5Oz>yGeb=$XId$>R4Ew{ z!QA&dGJ8k9c05i2?>>s#W>AthM7NEHc17+758`|qMOq$vGPplqdydeafgXE%x0fh} z{Lz9k&Um@uQQx@rkX^ddJjecSpC~h&yftr$RSGLpbV>AMG`NtF_4R8ni5&fXoNFxj`W0MV z3|{ALxj~ntS3)l0JbBHzwH?o%{&ky?xs1fjDRe@2g!;5R)Wn*)CECSC<`O_#Q7w0b za#jyFmY>iG9BY3ejDtK!o^xesDX|x0m&W~?tBb?=+B=p^CC7wX3~{}7)rc`#LKv9= zgk^I?^7(Eo9bPg;`$ZPFor{}P=8Qb29Euj#Ux{`|g_dwk?}6caM#h&AM^7VyBpY`t zpfb0VYD&`>2mO2h(Ra6Z+q9vR%J9Jv<-d~_sdUMz@nLvFsJS?SJb&nnv5iE=c0Xij zGyDT*e#-EEBqfXewwK6$6%ZwFW48>VNN!4X?>99Mr5HjQ! zu!R?|3mz{?3a;(j;*7ovazj4D8Miavezxn^ohj$6Md7H{wEw)^ZInlIb41vl>m$#) z=X0Xx?!=`mTgwS~9nK5GOqTOakuE-uIHaSEDQ>Xd4@Yw>>>dwP9O1&~aAGXaZ8*`a zC}iNl`CTv<`|f~u^#(z0iW*070uOuQP?ISCDo($c@^?IQGL-35%ycsP8`8PO=V{n zwqBSY#JJ|_lm_>lW88Da2~J;vJxG1gO;K4(SlhzZ-1%WT=m!z6t`vKSAUKD?`bZ{y zYO@Z7qjyYYEpND;JvdiNyGfv|Zr^B&u!ObR`~TRnek2I8*C37^Cr1wcFQr7^QR94- zOdft$fF)fSvZG| zy$ViLELO5#1YUfh9d!j5XUS3i4Ep!R8FEyAW*B`3?E~e#+wMQK_a|DF+HfKm9Yv%h z!Dj12NmpV2i$*m*P;+Q2#Aiuhzbb%__y?RX(?RAbB^V#R{!}5g_fNQov))5GuSXF3 zT>+;|M?Ql6aZtb#YWcWd`2dD+x~Y$FvcL0!+LnQFK~~=J83TFp+bN6zU@n{q{dH=5 zwxeRyDELU9%#R7K?vvqo=s59_RYhS9#1#&_lgE{bsXBc2Qx%0P=@n8wqihkd8Ne2H z{5Gg{JgO&5>UXqp)(5puKfVqjabhAFZgDyb%*ftvzlrC;xy|GJ4LlEb$RGbcWelXe z_b~J>)43#@{T0q=AD8Wu*99z>WGD1Ev0Sn}{{>zz+uE0r@A-fzTj>Mfez5#-Dy|;} zL|w;KJlM^`$>i36mJiL(M1eW-^RtzXgL==^ma9=9Qz;^FTgWnTRw3;iUS|W3iM=K( z8x%pN;xi}#OZir?IBRM2iwdda1vs535$ps`KomHC@7-(fUuhqUMH+84gtkHd+qhRs zbe-;wT49cU@nW=q3EIm!DYTSr(Cj^n*Ae^`^}n_W1?5xjI~1nPaLofhA4&rA+#T!v}m~VMvKg7I`V?G|cMnp;zoZOTIFxL)#RW zTaiy>s7ZdSP6sE=qH(eiZVEiZIZuD~moO)Mz6_p;_hwj1I|PcTM2HP|kH5WSYHn#~ z$LWi$N6v-rJl4_KcBT2V#$SJtaxL|<{qqRzp(n)JXOZZfs8iG>x+uCNx}uPF$Q4uv z0X`@O>L(xDWQZW66yptqbvz+bOfZPp#$zI=xKYDW-cNv6gx$bi*bV&NN}_pw)#IY- z%_PBo=TEY$gN0p#fU{e`shEqohSez71RH~-$m%}})t9#u!PSZI+YP@BXj#<#N>aYN zg_HV71F3B`gHr_vAFVV|>_OLfMezYnIM>-cAW)gTPaQgwg zqYE|3G}1P_uUmg=j%Arzp2pt4Ap+mn7_WA%yF3kI5v;rRrAoxtL6YzZA3jqQ_Hv*l zU)P$Z+y>wHk*n7;YG22V1hVqFt(L=@73+w<)kpCYr$4q|NuF`UsHE4SYTv)|4xvr3 zK~2Pa8|(=frGefk*XPLMucY z9A|P6r>!;FQAMoJ?J%9yJPm;ciO65F%qbBb)&4c9J<|aE|H;L_gWe$rz17+VaXW>k zw6o(Wk|ZHgiq6=??f!^7%Z|5+tXrtjreF5%n>4z3m+{yPB&WtxL6yGk#$#zHzFj=S zBqyoh*?*UPY7^JYK$Ba=HEHOXR(%8ibeexUoypTn_>PA)^03DB4FQ^sxx&d$N8{zQ zJGolZf$&gM`gNSkdT_xqc@jwN_|zN58k3wm>jATwa1K121nLU@2?+RW^c$gOd4as03iB>al|Tkhy5 zHie{XIH3W1#_OR9vLwG@ zs*0zav>oAb6AxqD6Bh*BFaI#5=?HhB0ZyFyzuf-;Na*|yciv9D>yX1N=e!-yIje2X z9l9frJBVioyCl})$lB3Ch%@jk?9;ujyJuOr5?D$>o@Kg)PvbqMZTo5dY#z?@NLGk? zEmeL$+NW*1m0Sh68Sb^1?`63K+by0bJAEEWAV zDgBs(+?w|$)juVwg?Co2YZScoHs>4k6MSa-;5j&PZ4p%v)jym`+c>b&(hp!JT5oAv z`V!%0QF~)mR3>;p9F+twhi@)8+Miw}2A)}(%R9=2Wk}=f%H+ z7Qx7ZB}y-WJpUogoF+BZ9MrWx<5EHA?0+Cng*F5Jbr=54QjjL@aY^WbL@zOh<1aCm zcHAqH+qlRW8i%Yy3z4M{=hp1k_a${qS)WC|M{e)=^4gID#$$5AMNgonz3Lc$#FA#A z?y6IxuSDx&-irx|eK}Sdcjvj34Hq{o-B`CVlA8|x#5m0p%m3rU&Qr)5JEaq~Ta4e;aDJ&jUY=_;*yY zH~U1Y&0x2(9Ty9ayIUya551r>2DraA3G}+}!aNVocEhZ`Uer+z2El@;5O#G_eS4?12%#8(_KqJhnAe2 z_)C|(I^5;;zYckQ?sG!uAv-^8BbKeVU1Stfya>g5IiXxY6H3br%~Co0T_~~E!upOw z><&*!2lpEewCeAnJEvZ^_l!cscj|Sl`D@2|kZ|gRGm@n4DJR)VPtaGcua=7~g?&B` zr+>BvX#D(k?4kOdp_;&k!&(KmJQgek1{Gu)LT((&2puUc<5 zf8A(dYAx^V3NtC>2FQeK5D_ElRCv(dtd}H|-Q^i7u8G6;M6g4BQ14@n!(cH>ju?-{ zK`qiLPlug;Bgm|}*(#yE^R&b%gBD`iYeM`9a!9mM7P9k$w~R+Uk>W24kRi4n&KQ-y z`yR0pPh|CIA|A)?Ar&6cNYWU>ak^yPMUdx<-LV-|Cjs3Of;O3RE#%#dUM$YSHP z{K_AzHBB8BgP&|-*kQPX!St5gdI%cv5{9|xG%-#}r|t@r)O8yh?!;ba6uWPYTDjp- zydJS;z>1iStS9`S63IvZovbf8&BAcY*soOtj#kFE7|MDr09hXdz@Dwu3-5NUCW>gP z!h4>S<>1xS?5=SV_J9ZYo>s4V$uPol2%fWVocPT+wD&B?=6jIMv{o;xNg~2<_QeAp zP^&c#-vRlRy10%t^Hm`5*yO`Ej?2`XF1B=>cjSJUUsJ8A_vhqS?9Oqhx6I=nhOY&V zvqy7nlVw&)F8;96y0(lEw-1e2*Le{q_tdu?BNQ9U5dOtyAH8Jv0~pgX{B;CWr|doU zhe1pou24M|Te$mzw31#+K7q%_S$)WUD=8TdmivCK$?J3dUs%dh!XEU%+Sh9q+aOo5 znxm5sMp;eK$$QUUQyb1Ig&~n_FAB+s)k(FcYo z1Y~3H33H>33R3NTrrI|;qO!N|>j$J9ZbyiEe`@*ua3l2p!qr#kcdC`FW_^m}Tsw!~ zUmN>g`%z{8R`AW$#R_t+_uJJoWeypBqnNZFb#l&U`kUD@xM?Zmg10rg*-*Q0bv`%y zd~&PH-ZP>52h?|T%~Mu}-#}0U zgi3-6s2dnKxqk}o(m`z$c^_;JrYXcxy$9PL3cCQu+MUMqp}zN26;!~cLhh>}iXY7c zk7hVeGVGo{7-@kPkH}Y~`u})ZqgC#I1IAmdy#Xi2=;L=FQ$YmGZkW%5KOXUqe7SDF z@&x7y_TySyPZQ4Q>P#Q+ly*Yhd*^$Wg{IX@>W7Ys4!}MzyQO~UO;M<2%^apweU98cwUqyin{LyH6QEO}vIX!f`6>^PQ5>FoLu>-C_oFIP7n=`6C6il-;+G z3giKIXb9DGkjqSzv~VBT@>68gh@a|baQl@cpHj$9tJt5Kk$a8#CBDiWu(U~sXo z)UoC?2W4w%H>$t)XNWQ5OX{y)MVFonru~SHeP^~G+G*_$LDnxOq5Af2;zT*Os}|1k zpz28DvtN=*Z%{$KML{tN-zZ#pgRcovxSg+;bc3yPJA?V($0=ssl-}|L&uZqgz8P58rLu3O9=RX8~^{+7Pukc9qcoJf)xWu*v)|#l@2;q z@BCZN(OFo-U_(2MW4Q4;|0`#D|8V00hMj^s3cg(fJtcz>X|vzNdkH~rl4|i63w2N_ zA#`MN0(?gx?R4VVk74Set>RPW6eoUlO^^;_hd~w!H!Ap=a{D;fmkDsYLJZ#~K)>K4 zRLY}Dw)dr#8lTlr?Wz;*v%&AB^ZQmtxZQ8FNk^cPi@y_rd;U@pRCBA&!YzvLwn7!w zxCrxQIfd`ieOq<_s*+D0a@5FyvSQ2K2~Nrv_TZK~ZGgb-Id|$+XYZ(?I?Ge;4Tp;V z&+6N2M0kYhU~Ao@?B;HypwwR~*LADOT~k1#SHA4HRqb81LbFvNyEkEBn-`<(?h}RS zzU8%4xkXAeQ}7)G+>HsMR`a*4HCu`&RdrUa$c5Wi2RjeOs;CkE>j_O7Ja@Qwc>M`M zj+FZ9I@pyaji;wp?-$MlU`;4F)C%z}K{z3S+Xh$H;hW%ByYU-*Mu73BoPi!RJ{wSwjS~e~y&eRx z9v79zaMc1XEq2KD=YY$9vw?Tvn68|GN|c)QxFKRU*C6>PRZ+RG;&FYBdx2iw5NU9Q zyr%)GmAT-(T%$()RKT2pZriY)sn93xAABXjn)(nvUlzRL@DeLE zI4WlX_3V}*r1BFX@DTHbuM(WnCeDxyJN|}XOFcioC)5nQw89Kp6nHcSjqsz1-+A|!7_D$0iv8&j_>jTT!gXxw5Nb*r_Af4*b%UQz*K7Z9#Tv*OvVn^n zA=0SF;jc~(#%j_?xLb0d9Q!)(Bcgh9A3h}@OGF1d@Hv6tIq)rtP}4i6)hbrciEzCl zuu<7<7FpN&qmN&%zj9N=PQD~E==L>UYpiN*Y$dg1HE1@;iU#0IqY}yoW;y^|A`e0f zvXTwB-M*LtXIa<^E`ar8s}fF3@Hrkn4Foy+kW8(q3H)cIiQV0YKW0G97JNk6=-UZ-6CJy*wF95w$*n`wW=jkK9H<8`n@DUfo{$zm<>osjc zptd;Np?Ba%Kx=ZaCh;v1ZpAFVs>a;0k|6~8@wsgnZn2x?C}5>Z0)Ag&GFbZ<6mUKO zZo(r{uDkszzR8Hs$C9MhJ~Ikvw0FJu=fjRuz9gx=>$Q4(Zer01H_S-tO)%5*IW=gpA$PZ|af{pDM|qWQO7aST_mx8-6VgzsPn zT~e5(u(zNf8Vl>fT5K|ljx}^k_uGv#%s!E=M;I}@$M+85dynXMD&cPXggN{0JtT|L zz$n*oqLNm8XW?Mu>Bg(AFU4zN1bbIQ<5+Dyl`qUH3Gcv98AHt2i=X>S$5V%0!otqH zXoYza!t_arQu22ZrVaJ`Qs5Ag$?O5zTHYu9;2-w>hE{P+tIxu7DU9)$#0Puo2>1pds1i%* zNF}yAagAgmmdZld!M_wAXv8?mgh8+%f22*utw&$>z+EUTvDe-nD>1Ujp$DBuz)Fju z+TRK?TL>}e(Wq^83`yZpISP-O&g0;@FFd`J#|kt?bU=LsMkgsjY62$beowphslwy) ke{yM1cJ3TOf)Y8BLX#lZ;4GR_su|NY076>FXD`vxn9a1w0jgUaF0SRfu z?|;nf`|SJNJtDF%1618x@wq*Y9XodH*s){Bj{Sq*{894X{pfH0bN@@JRQd`3FSYfb z(nm?@_jdl|{f|o9jsNC9R6_V?bN%W1)9_=#-|l4eXnU8%Zho$h>rtuLQ%Z9aeW zDC8Wp-Y47J$@b>9gSxi0{cP>Z*V>wU)lHbPYUIZ$HQNA+tXywy6Qep^v}wqSO!?hyY6@bELUVfnac2L z)a!SXX)lB0i{sCwFIPWatL^Uj_A>K02ddjWpG~@+5-}YPdV{2W*&8L}?mGwU-AZSDrBm$VLF;B=xkY`b<{#gV|Mc+`UM?dXcP-TZ4-(zgnGUtJ4`b&-%mm+sXGd^TT>~&`H*k z+e%EPt?~3hvXM-Bzv>RpS7(s$(ROqCz|jsGRwMp7QCrFIJn6Kit)w&TPLjcJn!rWv z%Vc`lP1?gwZ*Y-J+Lzs{?kAfh_Y(3F z%S#x)v7iF1P)=pe0r)&w=_IdyW%=j**5ndeOp_Ncl4||9dGvY#ZK3Go{bbs`+ORfe zqvrW+(4Iip7?0CIuMHz5%q4>z)1fwa*Xs8=%1e4zEogEH{kvloZ1>-m-b6Hew4J(O@m=>~wsQ{(QW zv5vsVH;?gtw!ikZVno%^NG*g1H&$*?2$^q{UA@ zDgES=IZ0AF>7EUTg5rwg_*pVC(cqgzTp1;otx0m;LK1<&=FQ5@gNI4$41!TzV|zMy zI~ZOMO67XJ27z{~JEt#`o|^>Iaqr@yi{wdmP8)7O$FtEi8MfQAG0C6)57_3i_X03 zK1|MLbj@`I20QOTtrjy0R3=Cno2IV9Rd+Ihg+xI)G!?N+~!02^KsXv$za#%3&5!9al34P+Hr%5Ghj)|!z6aIgidHQ?ODAQ0x$pXM_Wd&YZp7c4S((OG z^u3*Z*EcuzR7LRXQJHd7w;ZQOb<2-3IOWID_mk-RY4rU?_Fa$Q)FU|c2u?kMQ;*=( zV>r(um|sTUTdo7HU#c7< z?}zkP<&#Ej*UI#?5^N@a`lrdH*&kjs+nSr-ul88{x3su#|FC}19dyS|>VB0g)r<3J zaBl4YplKok-0!~Y_BW<2zS3XT*oJNwg;?<%6X44sq8yLybhUO*-$mh4A3lAN9G>p)Yu)XR-*r3RGY}JLV@^@Z5>etr z%eiq8unk+yorrAqTkjFOP3ehJX80$Ao%}r63h=*1hG*cdP0Hqg@H^Ibq-2~_>(!HQ z7`*Di(aCrGd|5j>1k#1%xv7|}Nl@(urt=>|_6L2ao1p4khQyGowUALOoir-?W3&lG zk)He+dQKM|2a=%dghf%SEuEb7I;L}tl9tvZme3{iv5_)x6EUvb_Ab9kTF4#Yh|J4MtGUCdkSpN?&z-VBo%e z@QH&5W2c)IYd{HKnZn7k-mD!qPMU|O%k|A1?(P1p)3wbEdi(k%;|2buNx$12H7`cJ zVSfHqhJ*9o#f-I8y76R)BFr+&dinCWc9e`*x+z|l=<+5>=4zYq1|xv7b`U1`?KC*|FW zShv-OqdV`Djw6INwXV#9Ia1&;=^^Kf9+M(yBb zlW}TR%KJ5~JI!x|=TJLJZx@L7YC|@w2o_Yc-kD!4r9yuqS!GPZ-yH3|nv6EDLH2wE zqn@G1Pm(U`ZMQQ?)b4J5|G4?;=;(DFVB+}ZXx8tu_hgt>?RT$pBSBE)hXM($jiv_5 z%lH&lhn-2YJBWd$d9;(yiEyxbc`U5nrKDZH7Mpo#7RaQ@h-InSMvo14ja{U8v)(va z{mjZ}jhS6_Z8i*k8f*lj)jN6pdjx;uVwCr#((;HWij zUAZ-7AzTv&4@wL3I=u__@_q5`!u%FCjp2o@ZwvF;zq1!YgIEN=pZ00KE_o4b$0vqp zZho#zP~1@3vVE{Epju6wx?>BWGX^EA$CZ-@Fp$Scb3R@}>Si)Zjz#5%NyW@LGC`ck z#NowzTAAg^Yo~rSVb9}uvD&B}Hqe~JCy3PMLG4fqA3a2}Y6U`-$@frx{Qd{&u=(`O9|V7dZFH_+l&Dhie5|nQKvyRN(`FN+lcWD9 zB_tF!1(YXs)cyD>*{L;FS)g_gm_N0{*G=eyeu-v*4H6Ydg0<-eIB3+(%i-|t>gQTO zT!vrjWE1UNwVIN?vytRW(X5(RsRC3#;%*M0F?QDH8E(+MnVt`}?m53aBK_XL7SdZ` zZqiSU1QU8885j$!RJqxXs=^RL%O-3r^883MA|qi>-*EGD>S(D?wvqg3d7 zm2I9qprO?z@Ma^7*4^`gD|L4{!McLT%z?>U@XyHt?bBHForTMt8;DLS+QbBAs>SN( zQ++zr;hO?4N--Z#hm#GA$j%Txvt4uCP6ctr_EvW0rf^wBH;?mA%=`%=W=D!kIov_J z#5$}o8g&{cr!0H(a$^Z1qnkgPb!S~nu$91Vx76LEHz$pw`r2#k*q8`dkY~2tDlLGs z_Vw)Mz*!w9Z(0aSy7*PHq~Lyca5071R+Dz)W?x412V$aC{$*G4tU2ZP*7g^Pc+7(+ z-8jO8a;wP>o4>~UQP)auQsV(->#{<(t(VljsdF$PO8JwJ#4=Pta1XoJzTl`(@utoc z99?4U1I8;eV3s}=cB6MS&KMd)t0%y07Ka=f{OrLd?HgN%K8qkKY$#agPV*R_8p;mt zO=UQGe>|K(H~3F*`8QX5Tczh3aD)_1wj8vQhu45>Uv{T;G&?OqW6?!B??s@Eb`JDS zqlc2)7-|Fs)sYoi9n7ZP8~$3yb6o?X-#3dsp}?s93K4K8h1N4lue&y0p`o&#h+sL= ziWN#}1IYu|PmRdV?EIV>u5YtiZ8T;#$K&2`%n2lObv4<30whsv zHJROHtm8HYShHY~^uFbvr7(&nbxGg~Qp^S$BMNu4!rlbu}q;4D>&=R~n1|Z)ph8Jr191 z!kox*ppH+}^U3#&ZDTk}2mS{M4$X`_H6BQ%159Z#C)`wKW1TEvtTt_PlQFBlL+4Q& z_o*Y{LY>oroozERm7Qg6E#*4#2}XjWnVcf@oysovyRxInG7_$1P@@TY4>Xmv`Q=1T zck-&+H+!t5i^CVxL7ERbT}WrL@vCIZXyelkIgLEmB-$z&M>d8og))X#Md#&i<_gPf z*>b#M<76mhL=;oHp#hn&T9c5MMuFD~s|7V|Y#2oeaW4pSQ!^_9)_(y$Uo?9KhXacM zdQp+hn=kgIXdBQQkI1ntx<;& z=hzu#IiAwdgnrn0|5=w^Ovj(fua^RLWasv`d$_#x-5LAyq_NMjXs6rnnhvI;T1bm>F9cI1Ugg(OoCm2!CWGowRpw7axo2Rn#T zY1*GGAOF$xQpWua|Cdu(c#qxVaLj4HvtNj!81Xd}IX|S6;LR0QPn%xk1)1qm5ejZxIq*gzP&pIMb5$>^FD$oDH6zIHrie)RUfw^dP?JUU}QNhg{_T3vu zo(&fAjqOtDypyh#e14V4F?4ROs^JcX6K2E=bAk0-AI*2?;!zlAdh`8x=ZCegN8K)G zAD1o2&%{4Ev~|PyLgj%iP}Gur%iMCB=abdX(gL4p@>#x$yNUbFUY%n|=B>O6YL#2& z;~i+0JPJ9Q2D_?tM@MAlN%TpM-}bOE>iDiZ_@!(CxOO25#{&eP+qphWQ(QjA`*Ti2 z%;_^8ztEPs9AZuiZ7nLpL>MJ^lnK6jI9JN2PAssnZ{wT9mJ7|e$z^DDaaoQ!Rkl4H z_hrBJu2`HwM1FvwAEH^}_#y?msND2M$9)lTm*RQPa##b402j5}zGpc*Ho*I#-~Xg^ z-s(>zyo$13=a%r-+*zjajh$r52GN7DCy$>!u~RLH{%~@sZz~EMc|6)W*1E5 zGF>L?L~Ijv(nPy}WHM^u`-jg?f0mz%F|2T0E`LD4>gX`nZlELEvVO;~wZ?VU!D?ap zuX#So=SXmujYC!+mJQwwcx^6%V4{7}rCc2nw+>+UN?{T_nXJnliJa) zxazd7c4Jt>(IN=$Y{|7}dVF_rDWi?(q*b?VHi1g<(19to9D~^!_1X~GR|_h z6mtDjI}FhrF4-Ba+`U8zm0YZ+33n;Ic~=eVfdi9On`>vj9yIjb4b_Ttny=$W>4WRR z3OHe3UBLzgOk)`)ehV$g;V{N0qf;t}qOpRQ39Y5LL zR!-zB_Az*gx*Y6D>zx>y-B?`A-4;3Pwp;AqbbG`&4DS#l0bX7YO=;3mJrKpai_UyS z6Myb2$Wosq!Ea8*2kooTs&qp1)XRqn+BSMQ zpPYSm&wDrXDO!|m->7{-aRO3(!>ReMEvW&t6OS=RRO9zy`oj~0f%lDv4jYaXx$-ZO zFSTRccHyFu`=8NY`$3k75+}VS=ljq7pj6=C^E=@zhy3*oogmtOY@@{yy?kJ}_g1k> zY%y;5%T?;NYYI*l$ZFB1xZp8Z9+T!%;&;RDX#qFkv{k1~1T_HBd5ACNW(kJf+ z_^wIxIp&iWt)1y2{y3VrF#CvZ3~W7Ff1Ic^j37Q3U|%`6n$`s;3uQTG<2&St*%l_a z#mPg*3)j8#o~!bC`yAI3!NF)j9lzft6UjMf>(Z3lPOT`;Y!u^REEY3g3IyvJD6IV9L;0C&`On15v2voo1Cw^C~bjv8AyZ# zS7XEsbN2-+j>9qKP)LB_mRPRsv0rqV9$qMyw9aK?#H0qxj(gpLJk084NF}Gc$7r9J z;_UiVZXVUcvde~>IoD4vha)^nFTi<*WU@3=n$C5%-+zJTm|R&`a&oTP;cmrfJk-q+ z@$Y?jyQ@08^<&AnSRNliPV>ed7s2HB({IZ4gJjIn0A`f=lBE(iXq?q&oR>3J4?C6V zI&yOMdKLY}|Iqa=#>dKA;l$0aXwqte$NX@0^``X>O$NEDdt5fF@%Mfqo5^DtO$z1l zN6uAA&92ER@@8!~=)bq6ph%lEi9#H~EDRu)32Bpv^2};(FE|(491Sf%$KmW784K<#_v#T0+h~FK*SeZRc z80{A;u$QQ8AC4aOIZ-d|t0g@65*@gejGhcCZ4@5bj`8(}nbRSi)1K%#OD}Us4P9zr zR@nE%<0V|%XUQMH*3Y#Qe4$AN3+r$DlK;|P3|~`7>%N+8Q%*xY=_X zuge}u&b1x-o2+_W*93ytE%ZO48mb?Q7kkeU3k#W@3wvA`yyn=)d;JTBY|4?jH(BE?6K#JV5 zdQA*S?Xy)|&RMDgIMNEbL!9ZDXZ3UarOkMLaxXi;@HS2}lEb72FAo|fyB{Vevu}Fc zYi9RT&H3AO_}TNp7$-9ofOiOOV4(Hs4;?kfltgeK0}Ho43~O`3vX* z*OtG4NujIOjYH$!a7@c-UQJBVNtY2i)#sQ;@(Ss{wP`XkrtK@t?CuzoK51H|otamh z;(Cdct?yT6xPgQkCIj6134x@sF&CETg{JN&++BaGRuLkIbz8II^1;53nkPeoZJDIO z#du`uVLYyML`!yI9Q+!n%RC$eZ~&RCRu7N31(%2;*>ydXeG$tfYNRO?;2*b@FD!dX z55?ml$}Brzkys6|9TE^+%h9INmgZ!;$HjxxE=)KG2zaSebv`<>v)cGZm;O% zWS;KX3dd%v)q!8n&8X{HwIsoUtR76doakWu-}-WUee3D7^{w@-O&!u3|DIpuXo3D` z3xOFxoyjQ3YK$TZ6{3qYCakR!F&$MgTRBi#P%uJS z8B)Xog2b4ndjG9>rlkx;NtmWPaJ;2&D%F+!!j*invi|7Y&fqZ0+hOG`b!F1a*L$Z6 zJXjJ4>2OQEv=p8Lj+!oo(~Eo5voj7TWGfBhKAD|y;H`D*wl+D;ZTez<0PTuXvoo7w z@VaHL>xzz*qT0#|qi1_#R!301rCul{YYKkQ8rV?RH1hX%)peyjt_E#HN4s}H&o%})Ke zrB5coQ|(5RAjU=Qf;gb zey-Y;5GfVsT<`0eDIwSAJtRSDfB6(0x!uLyC7@pu$_WvJJwU%KwpN#IxYuuEJin3b z;4J10+ zW~SYuG7{rd3#Lh_MXDSd>H@tVvbrE#=oE&16M#WPk#vQ9W|54wWiB^PHoh9dWb-)- z>@_YelL^Ed&Mq#sOOU?YA$U zp^T{y&R_q<6JgGA@=V_QYJbSd;fPyJ`s+^H^L#6tfQzJ)lAMI%@W10iJDH?9ss8iTO2aPu`)j=l3`9r^4dc6> zjz*<@q(9b2?~}DPI|=Gop?dF6>L6eEHP;i*oqUFNqCv7D#@& zGWn?;^1Jg)3DRE=)jM&Cc|GF=lNHwVs|JyFynz_WA^j7{p}k6;H-u(fHj*~JPQHAS z;QE;)8<0+M(55qYoO9kAUm+>GA+{ev{d}lN8PBmKIXcak^+0^NRBE zCGE;wZN5SBK9*U|ZHb9{7UdP{hIZwjtRPXg@ye#<;&5^Xo8eby4ZWl2#~w`}xtph|T%{>n!ld!EVQ z74diSk6pJ#>f(s|Q?7KYvepmG9~lVA1{am`uYcxd44gQ83+p016he)k>ct#H!V?9E z)c@>n^NMIUTy zfxRQ{i=7WPr1Lz=95q*!`pCMKb|BPuj5iO%Gh{aGo=O5$pp!=A;N+uDfSKYK7l#m62m?o z4_V(X%)a3dS+KbCOTDa0N zY}TM$3XuTWzp=a7b|i6`$%lI-6U2j&_;;;&s^~@fkqJ(vmcH8|keoest9ydC zxo-cKfcL{X``riIJX;=LF}I#xnNh4J)^@E(9zfSq1{`A zBOM3(ioD`-@+VI}$~X(nb9PBS;1~mGFxlkl#6$v$=&IYB$$`QoFR70`mzc4JO0K!N z@;csBV-^Y5odlYlY!0qF+LT!Y;|^8AnH5)xis!xsI-%D($1HjR=H90QNvo)}B9!?@ z=n9o?T<|-lxnh73f)*E6Imk{KI68I?9hi}dvoYnr-CtTN9v&{6BMcjh2MSWT-*}}n z88Led_lmH^xGV~?oKGEOcOVR~5m63PtH<^^N}IFMVi)0;_pz`sj$s-Y&DKAczlgJa z#B|J|%?wFB=zwH2Xr8xZ&2ryh7-%C4`E`E2EO6;DeB!mwl>saEm~QUm^{7C1$++Mj zgVPR?XcS|~<^-4H!2^o$Atc<_s^`+Ci+auSn27ksycdiC<9uPe2nJPaCz#21@VcNg z_8M;*jLnn?dghWBHb6cA3JwFrF&tj&)|&U3Fi^R1G#FDPn%#lRgAqaE@p0{iml@Aohhx^rCTkaOt1%4Xn&m7MlBO$_L28FQ+?fHQ@IcTJ=04c>6^^2P) zgNY>IsCU!ljx3W=b#JY6-k))GZ($P)`{9+1g*6u8umI;PC3? zn`ZUfM)l;7mm#>s-#pset7Gofz4}_(=wvt>8}di9h`OEu%`OQKDW2#u{+1ov>L7ZEO`KTlQR+LRriZ6ksov{Mj~ob=Mc?J` zBL1|zAiN9-cb`DER`l>(9rfE8`^nW6q5?l%L6O8~*&{WW!m8u3e4L-@qCEFfT$nxG z+OHqibnUwSih#3~SJiE~XWZ8A!Ph0wRa2v&9NY?U?*b zDBvr5qJNVF-8sw_9w}i}H}mjndZlagrurohk+iNYHn%%&&b61(MvuEVWkz#HxC(tc z!dE1lr^Z>vM|R`H9)rm&r``)#=u0Vpxq4Iax@np`Xu=~1X@ApNg|Wq+aj^Tu4;41C zw4C!q6Iwakk5kjH^Hfu192m`qR)u4}(Mfq`OI8$FJuAXA@WBvraos0bN%Nb*-aj`l zWaLf}+(^GPxLDlTbR(409?OR*n5nbG`@+PXP>ycKH!@o@C|6g7{?+V_8gI&FtF32| z>>(mzeCnwC9qQw{Yz^j9U@s%VUm-QWUfc?csHLISePD(0UaT^^7=(+}1|f|flr8}GneTcauGcw_=l$feWlKScHB8}T^1@4Kc&-mx7q6~N z-?<`sGrVlbuIdMli8e2qQ)H7S$ZGZ)-RJ1hXz=dICvb7km#|O3IJ(9;$6u(nX&)|L z8Lu*3Ng%3i4_$P-2VUc$BtWR7fcf`CsaP?>24|>wY*G`B9}0|I_Wq0?4K(Kbd`kCq zQl0(FCdIiQ%7jU)W1eCe_EDUTUpkrPyogmKH+KV^Nc)`h4baHx`_3TiL5u|-*eMf+uM>k#TPY`fLA=0p`Xn&|w)ow}e^m-ghx}$Fexo)iAc4R|fLeH_H=d(;1=g z)G_=XmeJoj4n?wdJ}D6xz`cGX3+-2Epq$@I<&gbwPFAD}(uRwjA%TRnaJ%Thv2IWD zFhQSopXtaM85uk6GdO-hsZpew1MSdwwdKt*$#=KOW>EqvMTI&sogQr~*pw%PY|oPV z;wD=wAK0>c$?<-|KA8xF1RlK9B7m}+x2vaD-jwBy#c?}MIn>Os*ceil#YQ#{V_r

|n=f#PagwF}$&|}vLx`x{CljfKyMiA+mfJT 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�ITa(dF&Fgt4fiJ%<^ij{E^%S6Dw_O(C z#vkknm&qJ4e;_;GCP`Z;TH}VHPFm1ZmIq%Wepb!Xe+!DKwkH(ptGH|V@tb3`sPzYo zeBAhG7o1eB^uP+{HL*`(RCA~&tmbLpqj*@sFTV}E@10nxnG=x#lgG;%wbTX+uq>OU zSrhLZJe9nChT&B0+>F@Rsh}?W+68NAU)#oZQx}>$_Rb~YUDP!796_za?ruHWk(Cy* zZwc($39vZuvU~Cl-9Nlw&jz zYnDEuijhPZm_XE@*DzzN5x*eU$hJV!f^*7V&2?pu{Ubcw6m8(2@%}E1Ku*b$ufu{@ zG4PNC#d-F7#4~^C@u>@~g5P6JUi|b_R9k!Ij5xW8{N*xEvR5o}t3-k<1D*cPf$a~W zcN0r${TUqt+s_m zqxKl@295V-nSQBjI)HTKs}fZa*31x%O+)WfbV2B+Y7d>5ATSPLyp&>(QZw0WI*y_6JewKWT*&Ul@~+m zOLVlWGfoN`0FwV<4=g~%0pb1s^y|@a8=7Eh!-g7W8(YLd841&)i=s?h)$p_v?w4zMIBoFl4+&EZme7n*E$Fj5!9;PQOsFDz zevaKs=gezyQys^d-Rxp4H6aQq8Buf#zg&K?-1OStH+|c z-|_=5R{wfF#6kN*i#K06IcZ>;D@RB@L122-YJ*3FSL9}u3v=PUwIHxcl0Qwe)X zT`8Gn5W%BkLXNf%yuhSM7%vHXD#`sjDmO|ag3nvLs)mh~_l^zwbgZcAs8VkB4jcSk z5i3prg1UcyN98nWZ87{C0d@HCniLMiZ5HWDbnBbWpS+evc&&a7`nPI)YF&PAKXi2?HJ@nuB;KF#=FD?5lV08Xsw(5- z4DVU@CoaS}6eX4*VyH?|RQn%wQUUk#P*HS2g?U@de;l;dsED*UZB*EYQgKD^9Wk7I z2m4O^q>X;Eo2EC{l^P>_T`8>Md@5&ogLR(|%Ws_zIWU&_(fRQ35bAX$_8;<2r#sjE zZwRQ&m4Iyt13Y(J9Fw6*6XU>C>8iiDWXx@#gs_^Ia37q zAA%F(KV_R(mRnZFjF{&q9cDF3kxK^nJgL_ePasPDVzmg`@_A_`{|trFFp zqYN$Lk$L5qqx4SrTJDc)8O|S-?F>?%Q}#w=k`tFK?dZPA2$~SnEW3!T0QCgtg&CYT zY^pLfGPxj9YZT9e{nd6#5?cV7X%sjJ?a$FwSnu}GRKfaA))kS4EOrz%H2arwHRV8{ zdpG3Bi&Rt1upo_UvxHRY5l@8rct=6AhCvTo4etSy4P!AFO98zejn({T8f#6DvBCkh zt2H!Dh;ZgdgQk_OCK?T|@fcYRqG{?^6cN=W?ubSf^kI(4Z8rF(*JnV#P1ZzEa#w~1 zm9UcGhllupu3tbcAN3)+4ld_Ds3>#YF02d1dXt4J(g2!_H9=PWivpgR3yXAwX>`>n zSoCRC!i`CF(GB1=t_^UU&;>a>5!r+>tpoLkXBAe}10#4oK`7CUf;2-AV4cRwj=w@Z zsn@J};>C&c-f5_W_Bc0&OJo(WZ%Z~)uKB}38OHe`y5|){8=ly)(g%Jk zAGh3B#DHgA{aFRt3~ZCSTBp4b7_*f$yHa5unHmY=Qh!DHFlYHK%o))F-E+3a=O%0c z=F6|YXzff7s)X+lYPzxBtoBPAd;lEsdl&41G3R4YXSIt6y_h_GZlM@5e zxRx`F^OL*x)=qT(?aaOPhtD6*KDNZhx0JNs+ifFj0?{zCA`_nq9s&I5phGWK3Udq| z^XvIdA}ZSoebzvlA$TADt!BTFHA6V_<%vni@I$AbD5l*}X2?3OlsS6kX#H4WS2Hi! zTIjBBS$Y1j`%}S&V=qk)vpz4%t~1JCYWhGUN<8u{Wqd&$h&=5nAur0NQ_JjSM${%q zo1S*IFb7#kSqWli62o#?@gn5F{BI|K8BHg^_~-=i`@h_?{|lfqt)`dPLU|Y_j`D*?mc+p6xkkKEpOkVnQtmt*a_Y!;j33# zU$Mvnm?+ydCbIZn-`x9V?a8K-m9~+ll4`;W6^Z&TY9912p{*9o$1jvS?K~TAWAvzSo8_d!>wD=pp&SEe3jbE0~Ay#Tv-&rEcF*6O2OZCRE%w9l*X1W zp%$bNnFenML!?0j9gOe}1p6Rawne%vCdu|%QGQ(Rgm9C1J%{{!Woy0ikK41-jw5&9 zq#9U!Ln!W0zYSTcQQsAnMthCSEjRcdhK5rCJA486XA=`?u$TiR`-?(Nu|{G2gZ-#S zPQGNDu9v7VtgOX*ql4?~C5}=U8U1#-m_`&KOJ}TU#d;2T<=fJ^er=4OBlL;Lv(O^M z?Z+=_UEWT2g#>)RtOobCLZRk8oEmJ@+JWCtM%4Z)ZBK2=1Ph zk$GGo@_D)E+blsO(>AXVeQABLWo067!*4K$edY!Iifpij^$mth$m7TOkC=xU1p7<5 zYuoyGo;G)>Op>kAkkdwy22}66C0EDxf_D=B*Key2(U(a>xJ7rwHr6NBD;~ZE9OXY9 zbOm{-FYDpI;1?eWkE)|za(%rOwC=oLRonn=QX}k0&69T}TJbbg8T34Jr8qy1_wg6j z>K^&{6Rg=6hTWj?0i9j79N*6myGnho6d&%{zD;E+*HSy&hv(RI(sL(^E?7ChDqk^&?KXpV-0uNvle zAkrY5z2*xx`VDog1bH9{brQXQR+_y+@Ghop$+Z~09-X=1X2JjD(gmX1IF0bb!}?!D zJ--k(-cLuTE2bq4;uC)aieS0?;gS~*Ux=F9OvQV&ioDdGYLMpRDnPE zhCChxu8%6Kkr$1cYw*x-oZ3^zDjoFMlyv@5u3!PG`Ntm_o zb6RJ`mpabU^VhtIN@>;PIs1CFe_1ItM96CcvE%@pAO%7uS>{71jYzOg$fMu}`L zF`!50N#yOaw;1&z4^h1&zh>c9A}S$@$Nh6g$gN8^`?A!K%8f@z&rohASx2BYB291b zZsToue=)2W`j+4jKL2oDA!$^o5~ZrfUyIxF*dXxpg7*jA>m!Zj#@+{F{KlB}n!t^Z zx=8y7H|ALEIYi9NqMEt0H!Q6eTc&T?Nmz`=9#kK*dPJ)1t_bLYP1p>Y-5)5xaE!w{&R z^-Jvqqt`;4v+#{y=ARD>Hi(YcId9gNcq#HR;yum`M5&J-$&cx#P?J;hXjE`Unkd z8o%a8d-NvXR(Egf#u11}_sD4UP7$3WR~8Rt#+68Lj-PYJXa(seGe_`V5?v*`VuuZ$ zdOWRFZ_jlMxa!gIXD>fu%TObmiz7(0p(;ajzADXTl#hVNqL6n$@QWe;t{ja%9q;OU zWZ>pGDB<@0V7jtoFw=m&eB(@RoYA9={p$zQ8}PQ=(*H90hKv(TmR+CDCikplBCgrI zYGbWFjh*=JEXlMX6D?k>;(eyENM%rZ8RfWJzMXNSTvGx%aEIAQ{~`iikSQqJlNR$A z)-l-p>(wWIS9b@r_6=G;4|kKDN12~)CsNiDsgIm2ufZ|voiKvqQ8d9ShQvAZ6 zkeUs%>={~QW{C)b&TB>SkW+$pNap|hH3R{ZnztV7pY0D1Lu6e#sf|}5U#{#lDl&~4 zd76u7rAy+=APXkACG2cNo{rDD9$;W%r7_td*<*2HD+`A+IJJwyl$5)CzX5hb2D>wO zzmuEB(x>Lr3x${%kH6od<~<9Dt0cK~q@fIXW^%MkP-RJWank8MdBwpbVLP(^@3C%n z-qKA+9tz3=hH*yq*^c`Hxd?~@6(~Q^eO}^UY@1WOn6mFRuXU+Yml0iAwAeP6|1H}* zxM$53l>rF^G{`!hEgu3-ID1-qOOv!lqi{`TtkT_3oDI|Ie0Gxk4WgFHm_}p+0^Hb3k_XLy2xQ zGZ)|2L$jNPU$yRE=evJh3W`R*HyuI-xy9-87cDM+XVKy_$;9yq|LM0?t}q^=br5z9 z^D1hw;r6CC3yQHAnUR(VZ^Rl@uFguMnUe&A`U*^iyj2~AERwSdvW!&yi?TLkR6eft z@T=CR&0|)wu2ILv7NQ6s)8;X#6wL3N?3py4LQNy?dNxeC7JBZ%qU*3bB-M?~ z)1R8p5QP;oJdg+WpnGL`Ay@HkQK3y`P?`0`8b+yW?~+VghzztHg^~bR-Av>|%gPrP zo-NE(cLs!gbccb5*!%kQg^c9%JXCVH)5ZNz`zYg*r`FYawPoEl8<517aDV%)wuuC1Uy|bU)p+7MR)oaW!tV=u5$di&fvCNc4_*fl3B)919&{>W8#;}#q_(Y`?~ z`cUaV7&|jZ3u%mB$IMY@?KwJ%W~7}x(qPmIGAVicFF&fv>wT5>Q?5Ek>)Frh5z6#C zF>BQoIx|yJxZ!|u9wKo*GPrNQBxCnkStsWnv@ziC&ZIFE*O(g@mA0GlR8NGIaHUqJ z$J-Ei48iWUPF|Kb(ok+to=s!8`)y*#Y>c;8R&Ek@Ecut3k;}WitF5qNt%0eAFXof} z|MSmTkjWjK$iZdDW71C9mf#fYvDP#@RC6%HD}CNcoY`U9*T>Q7L>4RJke`iT3+tTz z($FGWbD}BapQ}%sk9V@j*E*7?%dO+P%GCqe-Z}KU$j|bZF-&*^N%T7nmb7pN@-=kl zDg*K}wl4ohbVE4zg0E`0iLz!QQw{bg<*koNBOc{{!x(?`w_#XyJzwN3cF-ikkSe07=X!JxG&4(EyQpIHE~ZG28DU3t?Ob*? zCaoI!9U5m%y#jh+z=O!_xuxh%p*LA(Dru2mpL@AjZ4oH^`dB6CO=PiTXl>X0_RfGK zHdL(hAIhlKNy2No23*MsIBRFM&bQhhWTiQ;w>;$MEmeuj}0X&JgNz%BOIG2AoW6x}>7r-Outo!x^P%zXS+@>17VG1=1@qOAQ5Xv->Heae521he9W^-Z z>{)x|4AQCT1L83!{aSD?IL#I2V$_?YSOt}#!hA-|eJhvl%mXB2B=pK%$56v#CHGVt zWGNw=_obWumpP?3W7LH8T?;xhV7ogbZ0qZ@Mq+x1~!OFJ43y#8ubuee*v&@Nk8^;Qeses1U_G0(LTi&tu(S3%l8on>=!;># zF%t2KsVAp4iO)?vkDJE<%R)e#lq*6NM8y8&==Q2rnx5X^dtMFCSeGH2b$4R4F%i2p zNBbJ>%=HV;ijqW{98G0<-WI_pWKcm?TP1uLDIZRlAF`sicCEUtk)(!*2ULoZF56dV z6R48V%B3CjrWg2z^^1|@u{=hn;W^{Q`duufQA~?ROvMEk%kiJRgD|K*NcdTqrXOt25-n0!6gLgUJ`iXbzK)E%2R6 zt8z2}*-jT7{Zd*D=3Y~Fx-*ijRaE!24^e4Vj?X95F4e(59trknR`aqJ2t{Mj~ zHIjcAW{a+*GEz6rs4|CHe_)L9A{{3^&q%hJyY?QCZ1Z9ER&9veU!&iK-7lvai1Z1v zS|B(%17xr@f_Qm>8p#zojx`FW^r<0zk?f~#mqP;DfMPtDVZb7%)L9` z3M6d1HajO;@6+>SUwluo4lgr12eGY}Gb(&OmRO3%;hpZ^a1Cp)e2vqOJ&$z>9BK5- z|I#7Px;XvWn|v+O)=Q<(XN!4gtzTSo2Cz-nj5N~n0`zYZ`a>^T`>1Ci`vc8Hm_=65 zt*7($(O!8p#)tHt-cn35hWXyY+h26qIgmY(qn!kt23ehf>~}<`I+&8($}@DD&v@E8n{=VZ?Q)Pxq+u78mh%BUPbGUg{jl+mk zFKXI}*Bi(NJ@w?wV{;FeuiTSA&afYJZ_`J}c_+RFOZHs1KJ%lQ;#Y4^n45ee8PQ<8 z6*dUkHsh*WmvXeEzg}KQqtYkW4|(&P&QBi@UeEsEy!q*U{i!#Zg3EIO?L;c+M!R9b z?l!}y4Vkm3b@FKmc$Laj+*z76TGc97u4tY#%Ncw;i%=b}-2A3IEHB{LS`k?ZV5#ZMud3Uib^*IQkGbME9O+Q<-7nWrZ4k z5|rT*{q>MoeAO!R)Ld0Q-51%~v7=QgCA)PC{qC!#-zC^1`ZI4bp$R8)xsN{crgqHB z^t;gegn6!+o;hMA#S>ur=KR{Fw6AEDHXb7CBtcus*rn99b$PAIg8XzH_lkhwrBBKX zqV0qs?W?0jy(=qIE&jhJugl<+B+vYv>*d!l`_^aIY}`%j5nZLl#BG+<@9V9qi_?pajJjSA|*c;VxT| z?JZZKHiaajw(Ed=Nq}XVLUgLIqPT{=OZY-3a^i>Y)Az8|OP zRimyf&)Z1xtCYKiBo4778a3~bIlFc8R<<%G)f;*u`va_I^Xv!EtUannM!Gfl3<1NV zTNZYrRqL~R%MA4Wi?3CAq8soxqBpQ>z|}2?>;*lr!U|-^ZtIU~8hvkpB2u447un0D zM()ogOal+AuzE(@aQ@vc+Nd&2IUZx9R)zm6GxC4yc=#1%eA_Q-hco=R#}F~kjAB;u zZJupG<%c#S552H@p&e~Zc*m_@Tt&u$r`g*^;6)ysmiE!$Y)EQ>bvS2#5%F)7T@rUa z=I$~NxG?}VSmtUXb%HcYIi?#-WdB~oq%7;^IEmXFxTLh9vF0@N*ofdvY0*|> zD8|aWKIPsuiuLJp#NzY{(_ciL0qf-CV=%BF%ReYC%KtM)scq}J4%x9Yh+FL=O-x0v z=0O)RezW~T1pb|U0q~l;&PU+iP3P~zPSCR&j8Hx01YbV|SYzZbY|d%yU89yhyBy9G z>s=q;7ko=iz6z|r+WJ1`*(tPqYWIN4taop_(DvE=#^krp3coC>;O-8W^se{yEjI!O zb?ehA!;rRc({KerUA_sK?>mKFNB4?u2z{R2_1rDtS>e|c+lJVUK52HY9ywf~vxgLF zq&G{PD{>ekzLu(D1HV1oOe?>Jpuf$7uCq6YIw>HNu2$2VK4G3@4oxaY-hbhZ@0v>z z^pao688K;{sOj6#bP=%2RvERC#x3VhoHSi5J=b`es{39!j2bz}TD2sVn_~4fYNmqz zL@?sI@P_cl@Dt&u#Z}=o;->I(;TKB}lw#j?!OMv2%c_KvRrnd#kBy){v@13h;x~Nv zQA8+EExdX5k8>yZT|Hq`1mgYtFrXT-=E*rpqQsoU8D%Go5rN|KG_xx+IX^a>ssM?P zq0j9VGq@mjFnI%tPvZNn&>37Hea~f9IPkqSMz=#h4X_mNpM>WR}!^Gz19|zw{RaE^g&(bkw%Qw`m9}LSTSQn=Wt)zPZ+gz(SDU7 zbjA>zbsn46FHC?#__RJ{(hu#0{?%vbW-+d+uN@vpBLJ_~$p!F&@)@oe1-L}BRED_| zoPF8bKEA8LLryvdoLi56MPq>{Y8~#o3r~|yVg{{?Y@stiLxQB>pxpR=6w^s7$M;zS zj>P+fQTXOEA-=~up8+4+eCZf^iP)cFQkU)nhWzSu{X*QUaaB&s2DNcjL2W)m^CUQ5 z?1G*<**Spy{xgPVN+TcrLS-n`fZw}j6h>?AYNz)@>pHvrIs5RyQFO*yCx5OoT$$;7 zhW!rkd)FL|^v1&zMnoT3SVGR9HqZd)xDwsXTprb_ccUeKusD=gFe&d_OsR z+i!RG-V#knOg;7Qp5HH2(6>4KzoNupcKYTAOU`_T?0rZLH?a`EF^*e6g%=;B8*A8Kp z^dk>8s!6F@%e}w$F{@avdI_xOyuV_EDi4`4_|L%+xsI^V!J;+NO85^7dhs$NaYN+C zMf5AYfvCy&pDl@PT_TN9!~LWYMa_R+^rReZDJGj6+1t?Cm6(4ScBIggB8`w^l2g%K6zIptZsKM2;@tkYN41sOO28XmMJKY~5x^)W&_xx1a`N!0sIi0Q6qk&8A|8qs$R>s()lO0|~u zF$~@1$}{263v)Nxq#o}rdIO^C9u2Z!A&SgXt{ValWDGnp=q+R)%h5Rt%@3&3ouo#_ zDBEkhEbGQH;l-C%M)g0|-hi1+9Awpy0fc9j+7 z$0*+$%k+^|oT_FlZEa6&zRt>>T>Ha4xsXLI-;251XE6UL(_J-cL$dc6*pT?qm;)Y7 zrSiSnF4a2USj*C}%!h207C%ekb3G>~$w521%&^BCY2^NLQW|A4 z5oE7w#=U<3NiuFRMafPfjw7o-S8`YE(W44la9YoB=q{Ca3G1lzT81hO`y(XX=`=sQ zZ1enXY2&d;w*ixDke<_k$$YyqeHx>D|E`F;c9r3tu`wL0kO}WEKuI|u{_(F)9e1-< z%83-Rl`MRg#AQV}@fBuy4A-A_RE4>}XhR$;+i+lwtipU%?Obs8q4U1&0qIp$#bLoz zUAWpVDXs3hv>MlII6;NrXbHd7_)-^FvuggTfl~GOi7(e!wO{HHc6X{SDLwSaJ zo3ApG?Q)E?9lG0V4E2ioN-nA?uJ|fI6lGM1q7+Wp*w7bR%CcPaO`yI_d|wtT5+#?3 zBw?s5w|^UxR~Th`18{0Z73Me8QD%iG=%AmX-mdy^q@MeE4>Lw@c`b^mFwR%MSE&5+ zpPBO9+h&orb9UAsu5XuQU7z>Xz4wW?M3hh=?<1-}g#+&C1${fGb^3E9r~2VcW0v}V z$QetnLR=yHUL5tp_u{g3QM*f-Pu8tHSh43l{0jY!m=#I3Cp=uYE{YY}j47%ZbBg(0 zQQblPmfVL?qnDzcnHjUb!gNI(TU1egr5j4E0Hqd@2C%nose5=}U6k>PnA$voQY%1^ zi=uL;p^c&oFaYT>IEUQWi24`lwJs36mDzwkq-HI45okc!`G08WtDl4v# zwPAhFs7XWH^K%s2CLT~g|B@%|v=ikkm7s2dFWbyx(RuL(+ytxqU=NEoPCfZr_KJo*!(R8#SDL6Wr-$Qe1&;v=RY;4) z(@fWle=@SY_phxm7$lH_&-@7ymQ(R`P493szMtNQYL5+d(RsG9Di!69KT$RJ{F_aG zI&EqsNsQ_~zJ5*xiECUVVu!ZKW{%9?V~8!NDS+iG=pLlaap0HiIewQ}t#U>hqkOkb zWC@r7&(&6`aRT?}cBWuL#mDc8BDG5WFQlJ@7fXeFrYI^ZlZldKs-x=~i&VN;}Q0*k#47Qh5DgjRB8{p56FyT{G({j9jDUk0r&Jid4+L?B$nV8xpADcMJvFJjVGwY zJ#M-f(##F=5_@vd?@6SppB_0cc2@bUA>agrUKJ}xi>Tk9c(2T^bF9y4<7hkKyT+c? z?{nLUe9?rN#%bmk3&4%HSmN8dVzt+d;U=~hINXPg8=QUL>e|O=h}sETs}Nn`YF@N` z;8l`qLyaG^@Dr_KFB5l1651uZA0mrFHT0{Hoo7+=AMfr$ou})MRgoGAf!G7CL%1 z_62DE6x+AZFPmzGUsUFm@SMO6XrUV_%7mKk5i%x9wjD7&s93CM$9+`y|FQPwVNqS# z-tay(0^*bdf(b^X6qP6r6}97SO%+mAf=Y-24$(MN)R^vsm^dWqm;f~~2&hLu)F2UK z4EMH1DoV$Dl|cq2ipD4ooj8?9Oj;p|AgJ*D);Wbk()WA6=X>5i;G8;ppFOOz_S$Q& z5p=7vIK+`iJK4r!7T?sfk~E12vNwid$4|doJlay8JkdTrdB5XXM|{)E`?%g?Er*hA z#_`FU9ituZLSIM{ni8kf=l>0Ue|UO)Q_21H=@_|-c4n>mF0{3f-m_u`f3%)Ai=FC9 z&<1u-lhDA{r$cA|yL#B$#Cox1gaMH!<7$?zAU->)cKR{G!$R0$!}qdDS-vJFC{+`v zf>#yJ7N_AqPnI@;+Lg_s2KMpkrpsoLxNm3LW+t!fMrWblw0|pPg((*tWX(rBGTFDc zWolP%Vdpb7f#6@odj0QQa7d>c;b>c@bM<0w-dgQPGyk7X z$7~K(^O(aa8z0fuiIwn^_QS83&5P=}K8tzy^f!DO4wBbh*Z4^$6;%b?5WR9}tQe_6 z(KNJdKsld!x6|o};N%r*$Q-x`XR1x735?^mV_co5$lec>u<6q?G(y8#^P&j3)bE-TCyOO>^?Y(!gK*Bl3HOeujho~{Jg~Ywm^t7aI}gl>e2AxaAUCbX zxu6;rGFvBYotczF^u9=kdJ3G%d+8#R681``YqS~)Xwdl@83DyTcR{nCPM~lx{&CGhWOgKG`{g!NA zlg*@e9^;e}^q|N(0e$sdYR+q5-r?4Iuwm^* ze?2DlVL-U;u+o%naAh~N|C_g>--R((eR1w(4*vEODG<3+WNv=pqT)w4%O-So`w+xvkak}Q=nMw_c(L9SMY?Tkj1qA%#@48n1=yh%FKP@ z1`FqsMeL&QSOqN51RiCR=Z4z7!=-Gjk9XW3C!tkG-^J!$Ut*3@X_wTZ#vz+M+F@82 zugf1f=>NS&^w(qeJIpy}SWNWZ+s;*S^3OU_mYDs|_VN#xhlIO0sT^+yhX<~hM3uHiCQci%5R{qIJv{v|;cCL%= z5uC(X?{cs;saOk}2DAl)`|CdYH2|?0`W~J->0t`d)nGg9+o3H7Wpu1bb9r8GpBpa0 z#dfFPMd_|DY$E#}o;&Gb+SbzH62-jd2`|$^$L#NBO**(_*~*ofDfA_p@b%z(Yqr%Z zNVf4=J-h%BAENqMWU~qP4_>5#LReNmU2A6?8rmQ^Ks+_rC0RW2;X3 zj#<^3?Fw0tgU*%Y-46bwh`Z^ndlyz)HORs+|DtDofNr$uKu$pElQfO!8A<%M$L!81 zx5;LaeU#Rc#h!^Vzxk$$2Qne ztL%-@Bm4g5-owa-I%vMCHfjEb8RkVld+yFy_P$g3vpysPEi{?0lqlqbdN6HrF|&*? zunCKuoqHH4=cYZ#^66y8@`+;G2ORB?Gm35NN_%`e6LKqQ?>Q;)*%;9xaYVWEJLtWz z(vQl2Kc?tsDra7KG%9^>+PkIb-iTr`EyRi(d4ZP);naqmop$8-KsGEsFkx_FC3fMB zN-jQ7_k#3oB-tbR+{2#SU*ZJ71+aAy)M|o%SF0l@i>;3A<@2~zvi;08#E%^5L3b&* zTc@VAEw&bY`K8CLeH~7%F^{g+qOk{KjL{25{-L#KHqzZ%^nwwOTGK^8F}9O0i!<)s z)!Mrg#nyBqeIK_LuM7Mu{&exWbtB?+BL~LontY0EW9{)e_Wq+*0|SxkhSn&}_}%f; zYM`vE)m|@2aMX={qSe5_7vlp1KZy@4{VT3B0mn$(hj|`<+-7Od$8C-rL$F7@Ht7^5 zRFh0l)e0QB%Pf$8%O`t4ChDw$EHwRiF`s<5Gto#~x6?z(nT7qR4eZU(R#$UtEc^_3 zKtm#;RbSR=m%7**$9Rj=QLX1E-GQ7RGR04BF=saWpYkl zjlNWEnVN)qEVfwNvw$h(T6F=FNA+ZuC^eht;6Lf;DRgx7Ba(2olMbd`TFq&Y zKVwY^v@}OrJJ(;`ZKrc*1I@&vg=sA<%yI-A>LfYSX53}Ydyta8FXx;;zX{p$^Bm;) zINK5jCh3Ob5KWS7P3e4oz&bJ2eBa6*^ITmqn}U+-9NNkEm=NdBoT`&Ltq0RFF_s^PJwypdUudA9>T=b#{u`wlt= ztI^cNh*1&0&2g$i0F^$>QjITBF&3U9^D-^f!EBMDTzx)s-rArp*^#Z*p;FFsOXhS| ztz#f3%(Srr)(RPjlGAW>wQ>B4=AIh%B`d)1<$Z^8Z{i}kYzGyNdfg0~31 z%lS-sHS$Y1gx1v_-)0s#ntulYNh?9tQK2biu!{l*r`*eeFGSU;E*7OAl31?*U1E6d z;fhHQlYKmbY#+d;dOxV@D?cF$|IIR!c~i5@sr*f}Et=otj(OEs1`Wkt%7o&58`dRH z`UfprK_?@M%1{1~!R5+I>^#=)hizpxBcwOSs z$vmRTj`nejrNIHwH8}y`G@smuNb*E`k-Q2TxoS0VdK7T0p<`jOQw3>)1F`@UO0b@( zM3Zoxxvu4OJUOC0hYf97&s^QkTxGXcixW+ik4{Cim)q;MpWb<@=45T{sbh6D7mi%4 zGIv)#6QEzVLOQYjRy`2+^o4GeE?W_rDt@cud^e6OGt9A3mN3B!_NuJ(oieg~W4d?Z z>=#4{RsSE?Me`rFaYC8`9+E!(=HlzD5*?bJ`l1CgBY9Ag;xOJ2{in z{tITJ7O9g`ZBy^fD9Ak9L1l@iUjAm+V9yUAXQiBcQGoP_{fL-!gML9KD}IywXJ}O4 z4yUnvj{mRQ5RFLo?VvJ4uRu>_}OC4)?b z4s*|XnR(%tGGxTU-2juBt5@JeD0 z!^}r_sOx^~(X&d_8-+8U-<|uEFI+b0I7Mie_P>3HC+mI7woV#kGN(2u%x|^QIFcF^ z7zh4?J4?ZtQKx*tBfNKIfX-4mli8JDX{4QFFTCqU{U=6-Z!_HF`mEtW-$CD(V1Mr0 zRt!7DL09nq>&ZupvGT;-Jt<-MaUcE7)gcaAJqK&{9bKm%RAbJmQf&>RHT{Lre5FP9 znbBO|qDVKIp|i*`np4lp-d;%@rQ~5O*q3%HjW<_Q3$CSg9mn*OCoO+rXg*yVNA}`5 z!<7>8J}~u^*4*9Hj)x3caz>7OD3{(w{`uEuGSyNAl$0=mg2SyRI))PSPZ2g z=aI_1^a|a8 zj`QcwOS)#_TLue6*azdwS@GpS=kVo{8wi8&A73uBfpyizXb{P1xGB-#%4z7Btk-`& zSsy<#@DuzGT<2{w(Dmz)i3UWMG8`{fqUH4`#Fo)&Ka+Wx7+EKwfp7!=yIMW(r!=|V zYDIhTy%PFUi@Md+(#h`he_iPRpLX(xP&t)gncOSMDE#UG|1euwTrXG z%>FQ2M7R3$yFT;P?jCcPl(RjDSX2f1wDK{9f1JenlZ<&W)y6Y|8J)L{l z?5XS#pnrQsp_S;_`4j$zw?!KF>UZ+$nGE)0DdyGHGMo)yWjN@j+rPD`|Gz@4!|PMU zGsLAvu*7r zyRE4VF3I>o)>)PUTCSG*68Gd?73=19Yi2dSW7p_BqNgxD&te z#*c-L$J(cfHk#AhD+RT(i9GZAA>tSDY~)*(UhQoNt;#9`pH=I7B|wyYlHVgiNx3i{ z^3tvuNLS+JlxU4?^+HmHF#E;rKa!1J5oB(SBiU5g8I25_N_+}^Q~H$<0saEx5=%f8 z=&GCYqzxNcu35g+r$W;AC5QjEGLoiRzBIXWD2Cc$`+@ikkLh6-6~-B(Y5v1U{5Y}= zty~^iM&pvaPiilU;|jbSgkO4suj5l-ri33#esqEcC{}4dQWOyy#Exj*Qo!$ zw4?R6!Y_nJMjVLfj@A*!vHPR_Wvgc;Q9NjBpi|KIrZU)@h`X+Ci$uk3Ci5@F&*0nD z1|N&8i8?a9Dz4&6S#eJHFldekS-vt267P3723dAgOZR)!!InLyVDb5GN3dmgwRB&g z9t>N7!Q%5>j=`2))zbY=^$^QW(-86bmyRLufEvP%zlUr)iIJK>1E&d!wro)?oA+@%b)? z2BVkmcd7?s^aI7`UpfY2^aE26W8rH^M|h5_#R}jw!xBeoh71^m>j>VH<6wbrKFz2m{jPE}NAlPLA~_3!wGTEGxXw{fjbL3lg`i2 zU_u{@*vH>9orXHb_sK)q`-r!;FO!e^gtg=h&v5QP%Y|eYWow4CdT2tPRa!5p90$h7b5=A5V-;L(#^0a@ukM@$8vmLv|l-HQE=2`B&EqFfhJ8sUl zRe7WHwEq#$wP(M#MXTz@X%Ah8B~dL#Jc;pfhtca{8aZG$3HC`-ai_c>7IG8-?=MHZfuIDyh8R2bf>>qw@AmRO9vrZOPA^F{cm4 z<;Q)L^vIG`fM>yw4OBm+;w=GQD_z82~{seO`Vbrp5i#C2f%A9|Cj=R0d z667h9hk5~W5i-axQKg-pw4%5p06;wAOM?TMNjQt08Tg0}HKgE(P!J=4AsgINKmua4$~XX}|T8~4AA2Lw^x7x;bSD^438gBDOe zCyNPvS4-vnR^t7fr^?^kNRX@GoGDiHc00@YO)lHLk)Qt^CuB`#!YRzPzMkXzPhm7K z;ldE~{3}|U!}!mB#<*SpY`1gH%2<4LD*piGTioTFQ2w{4%0o8-GH)$`r}sC^`Q8!^ z{k6XZ9DJVBcH-|7z!EKQ->iM-7Rt2Wq_WVB^3W7yK}+Q>>-M(x ztV3DaLnkv1)t>ZW+?6m9C_hmXOm0U*-o|Uw6!kHWF_BK9mAje<2hShM030XtM zSqU4iG5!+nuU-WWK>0T4ed6~J<}qhwJtv&n$oOp^O68xe!27vRl~2suz0EnUgLUNa zmufg?&%>PH8_o_1!t@GG>x^e22X4eE&60+nCIL%XHpOrj^Gz8&&5-R2xq!tyq>XJ=<=ORjUyuyI^@me!*LICmSc%VN&Ei-Ct% z*;ncNH-v6-?mxwZGmWe~oA=jn{CpSFzWEP8Z-fLr-UaC4-UT`|59QlHK?!=3Kaij| zLjd$XmCF0Q59on{K2hFh)9!5N=vhqLQ^oDykew%-!OqnuifPB5V5_o^W5)u;&N2at z*tuq4?dCP0tsgkPAJ)Ug!Pv=mb53aXoRw6LwVRjYF2~xvxcX5!EErLP>;SW~_GdY- zw=?G*{JjI5ZviI0hik|4*r!%up3YmZvz9EfDh%CZ2~7d?QUSfAfL@Jkcb;?KAwX|c zPIi`a;#saROKUsCoV9Jh{x_Jj;}-UUiQI4LU!)(%3(e9N--5lX5ZegP^I&dTx-cEo z&zB$<%LE?x(+P6Ggn7Z7@JyrlrL~5Ym<`HjWMdT(Emu|EK!?(*?jR6{$i9xyqOrENINwD->fay>Zh>Y2d69)Mg1q{BxeG!|ZeG^TEa#!~obzxaho^UDFsI=#a~{6K zIq&*nJd0Vafal+8xt3fZ3;V&vtJ3#B{WHFA5ca}6#&5y>=^%`F3*&!6osFn-Z3n%L zFM#rYV$az4o>cxB_KedTo+{7FYRPpv0qKkb=*@ZHb*?4l`Heyhu)Lge zm-le3_WpI|H17fyVsHNl*K2QZyEo!nb9un9ZvaJ$CPiThO$GdpDzN9uTk!r5*mLu? z)#Yu@b2>j|coH?AX(#o;7nsOt-?sn{Z*d)Y+DV7mX2Ds~!SO%bz^DdtdE1=7yakK` zr4xp7TJ!sif9@I+e!x9_@p+J93pd0s?yPx>(@sM9Ya4+PA4=u@RsbV%AC(w8ej5f)++kOSYeLJ0X@-3t zq6y_*&oUKYw3 za0(d>E6bVyeGJavT1PcvLkP{SYUj9Cc&CsZ6UD}hs@k99UpBX_Fcon}t%;51zg4pU zLyUoU_`y4)m7%n9Ze{urL}vFOxwCn}K(&zKrG!6(T??y)oXev8ytvjDXM_CZ9&`s^ zM{W+@$a^-a$K;=~Iz3YnlY_jcPwYliau25?7uNi3$iSnxC$y^XK^oyPadW@5uD_%_ z=zAnFoVR%?$=f10OKMqH^t4V#I?0h#h$IV`5n|65TBSUqs@mxlyv#Jc}`&Y0+gCB=D<^}(i9B%n4oc$Os#Gc{!v*)=Cbr0q2^q?uU_xnn`ug3e)$D%drNAI5#-}i98@9BQu1Mho@?|VIZ-xKe5!}~GEVl>?zy?u|o!Upgq7*xkCmx$d0;p>HejY zT3K+!4F#zcPxmN1@RpZ23NNWWyzPm%yL}_u75=YqK*2qV1r=^6Nbh%dzweFrdx-D% zc=UdEJnPvk10-aSFJ9hu?aB2Ztp>;xJUlZ*%sxr0vGkJ~l51WrX^nzBE7HdOH>5d@ zXMNsYt{IrvtL~p6*8QnNm?mg_uTwv1f_wMU1P)Gv=^%OwXQ{a~M?1HRkms{5J1!O&6{O__JZc5^m!qVO4MHPtt zWgo&mI{C?|_fD^>d-mM(Vm9dgRR@k7s+m*qdKIj3Ya)+D)z%${9j6n1vLu5n1xErI z7Q9stgFf~Gee4DL*bDTrSI6vk=3JZ;_1dA=IK!)ueYt1ySnjh2a-ThJxzBFMeRjL$ zJ_V5b6u9L+yCC=3<(B(=0lCi?|GV6$Ux_65Q7%Cingl=B-#V5u`4Q=Q_@t%U7rH(r zo(y8!p$!i6kXOfo2fhbwF~u0PRIOyBEndv7s^nE?7-@{<)miMP3`?~Q|s*5`uj|I)m`?vVUgBg7CrGvTBC}ytNB^2oO9_t*o4}+0=bgo&tWCts*&xZXH1B-a|PT! zTvgCe?*p|#f3bGP*Eu+qx`6Dg>(p2~m7pPa=_zQFgFBy5puCGaH8;RgAX9P$Y#%E? zTqq5m7AWeOMsWu6{YUcEfxL2{OtPT3S=jY-=o3#L7IM7>wW>+-+XLNiq}XLfmhM7E zj-;JgymF9ibk)ru@;X2a0OM`lP8&royHd!-N^6Fs$?;8>?z_EE)QsDHj66^5wFgqk z8-+Yj$nXEHbG%yBS>`v|DtKOgXujFtHP#-I7Mhw0%OC3H)q$z-zL|DKcnw+5=S@iF zy*XLg)Q8WRbN;j2s}&SON#PL*I}M>5C$kvUolaXbq;X2X4ScV?UDSwb?f0Q={CkFm z)se=uU-JXK$*E3(j?xOePsgINQ-Bmw(zPB+9lwf~54_OU=E!WahkXOmEz2(<;kY zjz~QM|3i$h)l_mi(WG@i-UJ<~sFkJ>sUDyQw`O`nPUltoB5_3NA>D7Fw)(;EYSVZg z*OuCS`GnrH%3?OYzt84B3r%pbh+ zGUT+R(d>RB=WB{(stYXkMWoI??))`Ah}Y?(G$3lXkGot$5uM2bD)*-JB(UG_-%$A> zwwPgAhr9f_Ka}@fBU(l@Mo;*@c&XLDBSZz!gzH^Gjk(zoU3| z&tg!(Z=9e&aA|DPd{O|efgisE9HpGP0RS}GN6j=dlObFtA}%*zWBb|3;? zW0U-&NYvE)jWg9E(uU|Out4_=u%e!xyVhU_`Bg9aRxhd;Z4F%;WY97J5C0GIVZ2w9+lPlNpCwNt^5L0olVZM@*L9P*@uThc zZB+%tmV~56VVotkhNG6kZcJ%3ul167UW?nP$xma8i=FluPHsY69@rTvJ(b^L~fTi|j=NNQl??+$jDK@d7?QZ>jWTivTB2z-cJpFg5g7bUI$?+&MOqkf6K zCJPa##nr{`9WUnQ3@s)b&exH-qbTiwZKA!)gNuA><{W{~mK#GZ9RY?w2QNXP^ylA0 zLG=`dl>W+hdlI6HB2PsY!B0)Hqj?NX-L>DhQx&kd#ImCs3rS0_@Vpi*L9oQB&IR-@d=b_pWH8R|w57od`!;DSk|2 z{wu#Kje_qR418n$r#pJrN7{!GR)4)`pQww?Z@lrC0uhh!;quq3C{}%!J(=Vyp{iRm zB_)CjUypb#HfSlG%8%r6_8Pmhc#BMH+af!Z<=(TNHQ%%`v(Gooylf2TbiBxEi*s1e z=0n!;n}xG&oJuiot;$n4+s>_d&hDwbF_^P^xt{ITPIh8Xeow7(olg3m^Oo-{hpnNF za$VPyMqL~Wn+D2vJwA1Js+2=y3G&Wdx)ow2+A;rDVH#oSrJEsXuiMP#70~3H-(Sql z!HHnTa@$hgFBV=m>e7(4=EepEoevuGUoJBvD%$dx{h-8u%%!nG%%(y91r!782I8Wj zpZv~)uF1*=(*4T^l{XQ87f(NRgjkQxbOkiG2Z!(1g^9U1Hq4z4i|s{oR1s0|c)UIP z)SO^jcKE`D@n2_te=3dqArLnxzwxBdEs?W)*^T}EJBpxD{2)n(bpfl5w}UbAzks@5 z7M5AQTzjgrv3P%yuDeOFSDhqJ8SEy}w1=~H&5r*%^-{f?z7}+0GVibrLRLDJDj4}q z26gQ{fjig4yc+EC^J?n7YZ2%lVc2|FNWS{LtCv?ZjVS&|zmjpr1RV!E6}-JH5!~O` zipHk2!~KqiRJrNb)*@3^Ka}~-HV8F`KG{$HwwzKLUFotQ$5qEgSiF&}q(1Zloze17 zz$UV9+1+8wi{)ReJ%tmEw=@^sJKe8HJ>+M1wa+^Y!)PA%VaOdeY)}dI?#u7bBLCWC z-5fh$^k(cZc}^rnXzSIAbFB2e)_?Ayd}gq^%A`< zN+IjX&{U#Q7~TCs!m0dM?(^O5a5kEj5eCT=YnNsIATObq9rj(BqCzR?lK2_$ekiC zB!AC2Du)l>*$7ryT(j|^A}c|(ILY6$HzXyZUhtbsa-Ie7`}PJ-=fsFOZNA>%0jOU7 zA*?VpDLAI_D0N)O1Z98=4=Kqux zgBKiEhd=Ozg55q6a8DGJ`9qNrXpHnl^JCTrN!FcD&Nk8=f5m+JE%^obchP+Q9aIbp z2j$m^ehihxR{|G_W9=IvjSrEHFTX$Kr$8Fr!-Fp^4+x8@6VCTx@;*k!=Xi2@3t99+ z1I2PPf-g)wf+%J=utY(w8_lzbvHIKu5(WeQ-Hv*lndV0x%-RgHeS9ngiezi z!r>Xmp&u=5S=_ecqTRR^(#{BTE<}TPOBlv0n>!mXI|o_fmN9uS;`cZb4Ya#s49;aI?!Qlf3wdOI8|`3*#@}8Ajh^O&s>L%Y3lS(@-pA4FoSiBjX3z6u)7A zLOkA7tT@q^aH5qYu;l%^+gd~%Qd(nvW<_DDG@2g*EOBpPG+vKJGb7;X(ad7?siG9+41S`mG9q|Z-)Zh%8Ii?Ui~0AR~l_;L|yI$ zEB_HAu7@TSI~?rQZ^#-_b;$MyYZ?~uvy_3AdT|! zxTiTNw4+{J@~7E^KYu>+=ksp-8K_hd{=69*A07B1VTVrr2!FJMKL+*F_(M3OQ+HuZ z!YJuPO!R=BKjBdWHGg|ld=zr@M@MesJ6$wkx&Rj%TN_&^La<0fxH9BA~dT@JD7a8v72yiGUOwwZqCWi!|(eZ z8+Q@5TRk(MUDaFxt_5<)24Wqc2zE}RxQ?reD-f@CNMz|ZQ4G4GzIb)O`v~%0 zIo?&)F^&2g=|k zO_-ves+;3oX-_TBovI*M%LWcM?r{qvVg#25G74DSr&t#_EpW z$0Z83ljjJGn^7M@Acb%voRQ>4Iua z&<_8X;2*$7QC-?s$-{*tTeUXP%Rf*zlH`^oe>7X6<8hD{w6&FFmVDid(1BI>)Yy3C zHD76^FSz<-j1D@RioTXV-z`=mt^#&ff7(weE3#BS@KU3$*K9E_kbjWdqodzZqLw*h(3V!TS)%|8pzL@dpc-L8k&N|AmBqfDBVJyy6 zQu)bIPeeI3V7yYlo<|>Zz=nnJcZ}X|ZMz_xt>doTADzdWS5-$d zg_l3C^*7)+X z{B_eFb~hl0XAgy(@2TiUyoNTpgSF>a_F%PbH!+I_5#t7eeyOc;o55UF2`*fvTKMqq z2NAIj*=kK5WI3#b{V!Q>IFHOibcuJMg?wI&Xh+c|5Ooc9Ay6}@04{9*=lkd^5mez@@5ZM`5`ce?t!(G0 zU6x>je{L0>6voOVo(=B5K{>PImuyoVj+23xLR$bqtB!hXJ8Fe96Ucv-fmF$QN5v^slvXe4I zw3gN7HoD=p?)Po0CdL-8gAZkq_0jy(|4_$IUpzJ?*S&^I)BaH2*H&z9Im4We{W{mx z>K0m?N)zu@#>}5Jc7T^)9VqxC<9REnHz;Gz0(C1(Y*^#x@-uZ}e}I+> zd2Pjd`Rh`|b!izK?wk0lpi&@WgeY5R>YrWfh)nkH<>N6Odjz;@tj}#<7N+#OA+>1??>_zIl!h+q?k<0SRO}!3 zP1-drp$32OiAgCgjF`|(Sf?jV=YA~2kg(Yrm8b{ z-d&QS)B63iV%l#XlD9my0OAkl!HZy`5H z<&$%xS&=ucQ`Ii=A@FYnK90$po$kuY>G<$`5Z(jl^0jFDwDhIe?~8Xk^t}sh6K!2* z72W!-(=E{?3EN6DyPmnv%o$IVrFWHyzB$VH(ogrheRGs}U+gJip>+PCyifu9aq>>& z4)Wl(mI*UGkhLzL%(7d>iaoeaUVf*iaJC0m-otsTg9U^khG!G_J6IoRS1)B0$@e^E zKg-F0r4KAGSA*AVU5Z^Ppj^HOeAjLz(@yTm@iTjHLVs9iHp2RJW-<%%(03-bK4$^nN_k zThE`%VB35A9it`=Rq#{eDUDIca=?DrSL|n6CPm^{8%CD3+BeThyszOOY}lm|QyvJ5=CemaOMzAPO4lOceM}?)IcQP#tP1Ou0y| zH7sWQ9mEArr0Brog+p0XB5L(fvR(OAx_9~7Fuo2goIwk#T6&J&RJciQM7)Gb4;H3c zq#T;TQ(R&3{g9m9IU*MfP1mT*?doswy^|9B!?r?-P<*a?*teMzOJ{}ss2_*>;2QiY z_cv}eP^MhmSIjd0Xc(I^lHtB;+}ZA7#rQ+Ku|0^`QnG?gWnMNRIXRQ}NZv+L1nj&w zRzMO+&#{*3NKYUW^Sq(gQp?~7QBJi|=EHvD)AWz4^ z6KEhS%7OQOTJof*+SjXKzb6y!w{WDPl{B-exeL{0f zdd9FRB)yjM4=-OHbY{unP^;k0aU>xL{$cv@A}gW{V8K9Aa$<>1bvE+*s1tGD%{lsd z^`gqR%A}rk!F+4;eenDqX2ep&wHL3{wVQLB2a22`ag0-61pdOt2OQxdZ_AVwl7){c zhH3x$fLTo8D81T^%HLp?$Zwb>qS;+zBXjvC3Qa4V)_X&s9OgpQwFUh`OBdu2F4=E;Yni=+se0p=I;5QA~r8iD8 znh2{2o5y61FFide&IAnI0}L&}@A8eNC8i%uBN^^1Rw3rx)Zb%vCNO&&VQ>F~BbkKZ z(4T#kWa5m@Y6o}dp1RE9ZrCXhv1X@v1e2?#9i`SPO5_J;PJl49&Phf2&!Jv?~~$h50uNr@)P23 z?}tYEHNUpZvrOUI^3na{#z;hDK#VeE*62Jo$0oq9xUuxa51ipZbV$tR7_Zsw5pP9a zh>V6Z?5bKp&U?V4oh1{ZJQoS!=xlm-4>cMW!)4;e$v1Wy(`V4AT zvf>Nf!=$?PY}`LV*YGFRzstm$RdUd-B-6MbLGO}Nv5O$i66n_k6Yr6>Z3SUXxg1n% zJ8((Fp$a)DS&_-h=IKSWl2@-S5gciIpzGfBm?F-%p;ayk7?}o)TwCI9mD>PJ6lpBA z$!#|g{X`kH$rZu>murLlx$N7_kALLVY1;%xY9{bguv8;g)a-U(X&1$PrSq%eXS}qK z8T%MMo;Azx?%abJf1W#R*6rvCnE?@$f%Hz;X;>0 z30(Lu#oof|7FL*AWaX8C?UfCP2bS{FQ7%$Hg|a?6NlLB^*PpK@8#TlZvbjCzv7=H9 zTbp{Q6y;;X(#}xCI~FtTo+~oUu}8VNw$fwzXXlmZjWyEAL*lQ#3$oXUw(6grfiy`4 zY0|%o$g^+1*6Rq{d)%BEuIzm+5@UlVr>W#S zE$jp>B;%^`MCK@^Vjp72G|Gn;6)OBqMf2he%#kZ1HyJYW0 zS_)e6G?IEzN6fZ{hW1kfT2@|rUDS7i${xDvkRO4@$OCfQo|*(TXYS*{cn9(tuWOSz9cfIoGO32O z4rcmorVZ9Q%^eexmzNxHAX+I#xLk}1rPGtdE+AaWx&dnmeru8aU0AtLWCh^F1JC**Q{u1Gr}QOh9{##Sqg<_KE`z$mUne)h;I($| z)%8Z#&6Wq|&(1On%FO50>_)Lt?O*!P&t|;Q3AwEiadx1?eAvg8R@LsWL*`S1n#KrD zeru_JX?^j;s+E9waE;AaWPLn_Pn$h&jy3_8`?s}d-?+@-D-q@76LJKY$B=u#B-QT)<) zYumqkZ}{tcs|9syXF%yzT|Xmv$7^J#nfZ-68NuJD0#Ry9%?@~JEA!j><`YCo!sCvp z2y8EHt3)P2l4=8YQs0FffXV5MNtCHe&P`GFsn79ghtkSZjB7F8Yshd_FE4;~scCbL zxd$Y|iu|@gy971Q!2eE_TXpimC>hvJvGhyL>jumBl5Nu0CFQWoc$D{!czL2a5>E2= z2%JuD;M=&ZAj&+coiFipN1ND=D{1gU`i3i!ziKfsT~!-{H&l>F;%|ovmTRBh>3w5^ z39)u84J_A%?4pMW&XNtpV~Db87|FL!LX=lGsVN(vc~vzV4JQPpa%JbHNls<4&Rq3{ z4AyL*9~%!B^sMd}ko0!D(q!&l&$^xp>bvTKo~@)+SL#3o0-zJbd$Ye5sil8eL1uLa z<(8I8rEe!uL+CUpPM&ovpxpnSc`i=HXrb%dkcBUOpAakQC?jo@f#}nA*DJ~gTIEJ| zL!_=U%vP^ zxnBhGK#w*ed!!6F=m71RtHutSqjN=Hen1r8zqBAz-Jw*G{r+uTSj0})@241*3*(#S z-+6alx`|&smYMssdIZE0M@y71@z+_iZN?A%%(t$~G=WN)_bi-VSeu_5EPqNLbSmZA9kJhkeHo<^sJwF#S#wq_KuQwH1AEuc%HGp1O<&duBzfvYyST$DkMl>MFDuk@nh%2zscgW8?GR^HvLC**V z-4Uycv`aKYSmfmQJSgdta5C|LJpJqbslZ4_c4w~1>}v3ktkx%pbc9YLg4&mJde-Se ztW(cxhK!LX8YbHITOamy)0fe~c8$l2T#ZfooiM7`EW%0HlPRSqfg_=@fp3^r*(_SP zNl)2`kLL#2ZtH{wKlbsDbc&Hi8{c&4pVN>H$`kRouFLc$^Ww8IzO@hQ?$R&i)vb-@ zw~N^a^Ll+h^?R~b@;L*!yzGOY;+sA_M{j*Rk78&)89$qE1Gm!O)2qn(YAxUDVAFmT zT1;#fV*l(;Ie*K%sM^b7#99L%Ei{?hlJ6yii9WgNna&p%m$c{OEAlGc0$<2*6 zZ)=ftVJo5*=Es-$0;@t&By4@sLaoa-ZEkE)j%#`Ay=k+L7ne27ikTbj>eu?<H*v-k&RJI&8{t6q1ULdFtFuK(%LLhJIITJ?(@JYzWG zXJ{=by_FPOuqR>*W~Fz&W4{Ov-ihZhv&}Q*jN0r)E!8O}jl0 zRz7-NxMPS>YUkMjOVJ*y6f1Y+c z=8MAt(R+XO!CWU8%~#K=f?#VcX*9t>It#4>u9!VNS(Kgf_DT?3(5?wpsN7mlanEOM z^o#Vd?zMJrX#T92<1sE<1G2MA9wS{A9*C@{3!8zAG2Us(st>4ww+PJ z*G0<0EK$zeQz&vJ=^mhWfJOB0&t zy({hKA1)6*wcC0sHu5A<`JmIG6-KMEG_t%r8Pv)h-8tB{06!0}`X=NK!V{>{@mSW_ulWRB%d0cBcG{e?^W>6LlWIb4PRy>Wc0Tf zKVuRbUkWelo?6oqHom+t$IAh^*eMIJS6<~%fUdZ)*T=(^eZAwQNo!u;ZY+wDO%_fW z*}+u1sw(@LS1ffZ=3Ne{r19SZn7eNIg@mVp_H6JL`H!kZJVfB%?6j#3rPv)W)0* zQ8XuhTNUD396_{R%==B~8mjnhwH)u?HOEFKj->H6hk5#8)~0jZ`0`IGXr}+$EZ6X^ z=MVoTGi)$O7@XhD?NJPiBKSOV%};q$lRq^)ySqG!MUUzrLyqDQg<9?hz6;PLqQ{oA?%C7!~Un*6Gz=yt>x)2Ujtx(1K7KXrWCZg32wTeS6| z%tTV2>4~Ybs>XGfT!kshvN8iCp}X@@9eIXOJ|`d8`=6mdH}Ah zaozmAh1SL2%R>yT%*21x&bgj#e*n0w>-eKMGTp{bqv%Rm`cf?$ZCjXS2=6 z;{#Y|f*Z0u!Hcb%Ut5?myX}-Ij4Vrn+q`d^Gy`vVFEVLD+Po7@1qx4p&5#@3nt^Q! zO|Yj@GX&QVPi1;!??}OC4)Ow76*U_z)v({Fwqj2@jngvu@a|yS5s~d1*nvR$UR{B` zyqPUhl3(vNL}Z(tUamfqiD(1TS;{5k+~t&syiX*Xmu^dxo?gBJ-b@j>@ede=7|{h? znC8YZ2}j|%{s_Y?)hpP;XZbnL>hjb_Gc^i$p;r4~j0%h~#y!S?;uv3ak1-r$T;U$$ z8-ExhJ1>p#iSeEN!`h*db*&*pBzPQ;K#Wl!2ky(E!>DdX&a;Pp57TUZUjgTunQN=p zFTEo_4=36G1~oFFnvR+Hjo~bEqZ>ZoyJ4VkuQG*ul_{{w6blov&hSLZT}i|mQ(%25 zhD`qJWUMvCnrEdJ0*{L=c%UAwb5E*oV;YYg3i#|(3to>}@Wiuj%?kMKD{NMHh_s{| zQjGdZ{3at4Jdzc>Iz_28DtBpn{*3IITH8J5?9s|1MV%k%5Vbuz8Dt-ZGqB9t&0Oo2 z;!LAgyCUiyJoL4zjz1jZ{JnLD1xjaxAn~KQ%bb{Qg#^pHh=be$M|3 zN923IgJhOLHmCIsJvfYYb2eXTwm_06hYZ^Wp*bR!!}HFS^IE4=4|{Hgt$0-IzGBN@ zrSFH!<%12r!KaF>6SJLTvl(&TT|R~6t9c;X?7H5IAZ7MB%gk@L^thWeD)#TUXdnHy zyv&50op+kqPKQ=~nsE`x&Y3!tGv^Lg*JPI=u6YY|A6CC2k)!DEAS)0{aJaA2I#6Ge zqb(lHjmY?IUW zBDXy!Fl~Mhw>1L?`Z`lKGp*-lrU`ELk)TCUU$kmOkGZv3 z_3&~T_(#N#&!4}GGyD<%2>XP;wK12YTYFgq>3Pj}UgUPB)H$X*YT*Iz?E%bfy0rGg z-)gtem%RVPmyG{~=0mnLPV0;Ms9f!Tyu?l161BN@GkndBF@6?fxS!mx!Y@b_n_)4& z;kQURv8r74eMW5h_zDTjS(;KQ-7QEJ;;^rKo$ga)65^CxkV)gUqmQQB={^e+%Zvrx zb|Af{Q~5o-hrq2`ln=YU+=#1XK3vKFx84G+UA-k(sJ9}M)C=`WeJ)I-{;02=cFrix ze8fW+Q~vA9zM-+-?;90cChn(CYEQ_w#({19yf)Jo8jj4d^0g>qL0 z6+ulwN%2Q2;Dm-n112ga&gc2McSfn*&*$;|{sD8(x#ylAuk$*ubI$80=2pP!fH$AB zHsvw5sHyZncYLtVGQ7%{Bayv!NjB%5IgFc4aiBAwBXx4-@u=oU_Zj)@hk!n=Qa zB}LN78?qCzbi~^+)u3kL^P>NaIfR>=_+0Xbn3@Hi=a!Y!T1;)Z6{lArE2P{)oLw1K z58b{#mAuLqRl-7C?C){#AGTzgIFZV5oJeH?x*s@$hr9E{C|F~x;{5~MNAKCH$~q~# z7Ch7DQnsCVU^JuQUj`oQtIH}`Zy%cTS0>p)Ug||0Jo;K!FxTev+cO$ zL|z(|RcMU9n0Tl*%RCvjTcDh<*s7jnonA8$_Xa5@Or%+H1-NsY?Vy_son2B71s)k> z+=2T;{_SV`Xj{>#C-h)iXG1&I#@vBY{0FW?|8m}Hf%vzP;D-PIizv^I_buw0NS^=9_FNjY&VNci! zo@+_K5kwhKF!BteO69?YK|a;|K(&wP$x06XQoH!Yd;jjcpKi6uIsDI0veR>@O#Wv> zJ4i1~EdRymwm|53lAayj>>bkKrxNr30gk^)XMU9}weauPF;!WarqQ4~%V5>>5!=Pg zuaqdPgeRb|h(6E?j&7b~CHV)x`?<*LkI9}WNUMiVq>-1PTVjPYD~q%w(c|>t$6~T3 z!xnS~ZpCb(_*58!n=(DcLeFwY`_RPSGn8_b0upUvuaOEsO7cuCmIRc@1GHFfmsF!G zwfEt@Py-bLgy}k)5I~qXTbGY z5wU;|;WYf9O`07h;xm^P*~}J(f9ssT*76BsGk?tRZ=Cbzm$v)cl|A|k!B3j_6?go# zS?AoG$!2+ynJ7fTPryg%?M$TE#&rfra|lkn5~rkel1BL=URV?K7J?b+UHaYM?s~N2 z@og3G@>QXS?Hd@CAElpz){pkyt$>d*&M`xkGmD}!;Dt1y+(vR3uL`SI^nKG&0TDpgbR>(AbO8vFXZKCatf@G zMe&g1Whq>X92We_k)~f3X)}I(kjAeZzYfwEM}9o+O<(<=A zwOFQ0CO-uIiQwEYEUM-6$Re-k$UWbsed{$5M}x9Up|VbtKA)4Z1DOcW*p zPs5LZ&x&-6)swD4n#FrDZR=0aXg-8=?prjvL--op_Ly9$bo@c$(jpCNNVUaRurs6N?DyBQoY{U4;K{?k%dtPJ$MGim=iW5A z8ehoNep-wQTFpKCE%Hy+6x_y50g^eOTMv|hDi7h0(^+|#+5K)GUHO`Rt4%eapw+*|3^T8+g4cMcxpD)Vq zT6LCw(|W<>x%tU`@lLpCO(A4|_hySea&%conCQk)@b5#ke1&RtVSiu2lv&m$Iz8FJ_R2I(nojdDD2=_;7!Lq#UgkUsJbM3%Z`<(p5h~Xr*S1r7f)d92eN5KC z4x2fPsX!W$wHL+yQl7YS7C(#g8L84*vgBH`oE;^QcT3j_*ZXAGFUH8gw+*oJr#kj* zRo94A>ion_ea|7{8ALoEbySXBsc48iDMh51d1TJv1qZKOxq9i^#e!C8*X$c(A|`oj zvhS4JFD+fzw6H%QIx1T*mJ!X*f=zp8>U*oYRn+Qx)b@<`Am>=*+BgFL^Ea*oG-5aI z!vBU1st}BB!wCEj*szYu=kKEO`80C+zTrI1JVD$@E&Plh7jyD|z_?%HVs@dfhTMP6 z+WxgokSj)+N0H9g-uT9ttoa?~#$=?iJ2k~*8QO7&c=R4R2hTrxe8N%3iNYtGx(@{Acq{O z-|=4~9m<9IsR$+kpCC1W3qvd}A1?8Vh!OF*$P3{H+pJm0s~1$L)t!yJ$GH&dbC+=h zdKf^Z267>Bnvp6%eQzo#2S0=xl#BbETt*NI&q7WRH|Wtf4eOBe7#9?$@zY?A_J$uo zTFV7}Mt4B*o91-n4CV%C!PdWG-oW^&FpGQLn~)pMX@HGfy?HNkF{^uvZO9G6nKi^O zgyu7?7wIt0AMMMf@4_pQqviZ@&lgLq`6tqkaemWr@27gh;j;(t{WKvX#rLkeF^TK!V7tq`e=%=h{ zKQ62Tbc%06|D@ek5XuM~<;TPB{mE9q5*GSvZqP{|J3Mg5l~Rl~#I+qVM$a?P-H-PfgsE z_tjpFh+lh~aW8QOaTmSV7Y~eahH>W~K}jmN=N|jdmsj>ZU%YwBTstvu2kg$4oLSoV zR{fYm_UqT6g*i&p@S9{!%+9OhgZleO6#xId`#Sym-Islw%<$XPip)=vl^YLNS+N#6 z(>9l7Ej|q&HK9H5STK-rzIp4ORT*RD{|L#6;ybs_TB?sUQ*8I5bkV+Mv@I{2c?;O- zde82+NpG|K=#HteTb?isFg6z9?t=SBRQh!WYo*rb{c>afBO*k;oLC@KitTND@`5w{ z?{~kbbQ;ySY|1B@vLfe-TldB~bh*RXQRaHf5_l)NLT8K4fZ~DOJ5b|&_jE)+yW<{W zCBKB$yi)TL^Gw8--IM1W#C1|%Vzd3_;t8=lh2H4M8^oWQFU3IOp`WL(M1F=uh z2?G+n=Z*50yl0b{ko{g1mVnzjM`&EIcyU^1@uwfQNiY>}fVj2%JKtojaU3=0{$VbY@?vC%v?{YDuQD;M9^6yR*ylDsm^}!Okj&q^YqPSPy5lVFMYPGKRTY zlsPPkasFuPao)IfHyW@8KSqRg#ADi=Q1l%BM9{;xgtc1(A42m$rEGYT((aqXxHdGb zfAVsZ`Az7dxi+L#kM7Y435HbzBMWq#V3<cX&z7>AA8IMuzV?=fPI5wCrY*Bro&oqS`DK%(xuqTX*kArOTP!Iqes8 z^7DGDX>}0v$+IV9Ypug@E55}0n&ITg9iw(Ixam=C+l3o+LDmu+fb-qujYd1F>jd17SZdq&vgaWgICbE~1JEN^kE z?2{=KQpsZC{h^E;@-aWmm1R&@&^mE|S1$#zarO8s}G z7q=mHp-RHZ*rKw$v28LV%O!6@*^|k@t1>HSYI=Mw(kGHP+2NaQ_56&f_H1}ZpTfWY zCbx7GSwsk?=kwrG_!xNf?VmFIhVe=p7XqO7JSyS@6IknGlxCm# zex?9vr{1+8_MiBbqn!=;`&aL?D_>=0N0g8eQJsz&iY%*J^(kX}H zgU02oe0#syrc}GNmK|XD`3Q6y!*>? zWyV0pnow#H$N!c6$Ilpc8k=CZY=s_@cMNO36vwdqbH--sb!+bgLo0j2Cg-R4cmd;lOhG+_axx=B;fZX;I{$zZ2*27fZqn-w;uSd z2Y%~;-+Ii%3!uf~Nf=t%v7D0k4PdI)(Ry_ES&!juY~ZBo3d@9b8Huck^hTO%CA|?? zK`IZeLzL|I{aH{VrOv5fc}~Wxo`-wpIxn@CI3?r*N>N{)oqTknd1j5c=i)9gPS`IT zvTkVz{7LG^O>n8a+HBtV#{Zhv{qq_9bPKThz_Q*GdT6_E2zW2X8hA{4p0P0|8y*h< zg@BEQS*sn;?ZMe(j+yRLv4?O*Z6gi^rRY=|+Hndn1x-%h13uZn_EY-fSZyBq{nZJ* zSWo^5JxXlIUqAf(DZP!;_;^d`E5DL>tEVnF?B8Ew_)Nr!KAbrMu(PTd?gf6`8+{;G z+?m$t?(o6^@cs%Iod~Q4bsB9XttDs`Dj0o+5gtt&)(8Fq6RUEt5{&r9 zI4);G_Mt4#THIrQ{aH4zfe-8Fq5GKoM9h35WLw*lh)|iL%QXT8%_N**}bk-;m&l+8Ft>vDZ?6o+# zO>xW3|9p+<_?9yvrsnP5xps55p3nLP^5;L^X|(uSBC&7M-rBsu8O;5ZY|bVr`9?NgFmm8J(&zYy@pxGfn&wj%dA6B9v6VK>CM;5 zvihHl!KhyWg`Xqf+}`5OCki&Ob-MW~;bdp*dg&G=(vkH1J@D##M6CBHVJWCZo3%#7 z<@Dz7u-pGi|68)Z7b82P7q+H2HYs7UGJKZ@tMXSM?g$0jS$ahXh;^zaGL1aPlAZgW4tw04f{b z8I!fTtK8J(CSQEWX>k{b_nH9`e}qjODf%&V{2jUA>U&Fx_a_a9`}cjWzXSI=_DtXoc*J>+#102Qo|pXa$vVyueqz%@>3*pC}jhxc8) z88>IC5AdHA@D*wHgCe!8!3?Y0=_wVK4(g6Z#9DoV9f2EA!+NJ&euJo%yKU705z;Mf zm87$OvXbJ3UV-0N@+L|i4Wy`{;H7}it5qx_YhC>-LgN|pm8Qmvr>>s3cKpWC3E4#} z=&rHoe~8z+a#r7%q0tKp7bsr3J!R?Crm2b3D1xYy@qIwvHCx@8PxvzJzlhR=6xWZ= zSta*HK2u8UkIq+0?unEmC9TytkGm%jZ#`wt4d+bCr)O8Qb0K$Eh0)B&7y(-0N(XH= zdg!wqV3OxjsO$j*dTtKrYj{g+Rq$mwZ$#0l_*;jDs!><#Z9oKe1mmcYq z0E}*E8}V8Q>an+g!5wi-HtnP-&26-=QVJzY+@I3ET59&icz@5EA6_A@&Qe% z-_c6-r?zH*?>fC+^p~A80=!qr?wurn*b#9XsmemBEBp{}-h+MRY(hZ|oqNzKZpVQ4 zE^m(lz`bDG)6kosU@8x z`=uT<-}qF(73IxRA~Plon$Xr_8__#rvN;7?KhXZWZ4DB;iNeE@vqBqqnYb z&_>|NV`;Q!jmQ3chW9~QR#~-sZ4z3Z|6$Fo*g2L_Z&`w28Be4 z_BiH)hWU!CHo*N8uv={QDBJRQ}O$Bdx zbiN;dYb|b$HI0h;gFig-CvE;8lA3OiyEeSPP4p)%`mnCP^J{<793oLD65!#9e71`v zO70b{5dBHlc)egNnn?cy?>qkjKRzW%QPCea4r%?h|KdawJW!p*jR^ithfk4eC^ zr*M;WaEB?w_2^s0H0j&U|2_?G0AbM3@q;$e9iJUUztYp{w1~DM@f7=NBTCY_WI>Tc zGCe-ucf@$#bce406t+^SVxqV5Z}F-5g%s0X-J7(E>?^Q8mrfVyZSX{Gx&pq&QeoBD80)ibIt$7y-p`RW zv<~OA3Fwo^^SnC7q?5mGn2`JOt?_ad!@r(Key_xNPd_+aa4ygO(KCnDJ^Sp|@0eqb z)$=bngk=Xpxi_1(7zW!fB+0fXj!qmW5J%gU{>w)(*3ipenC#XbA7N?NAhM6J`;BFB zUu|f_O`}v;Dx3}_S=+TO$=Q5vKfm!8GW0g3)xQ$IQ6;dY-GRT4mCX3d$hREp-#4$4 z@{}k2`sPKIDw$WzHp|I=b`CKQxqp8vjWyzouvE)g{ksMk5^X32P0?CmDV~Ls{kjHe zg=76813O|v39b29f34c;&-?o_jh2a)4@}+euoo&7Om**|Zg_Cjr< zgUI)~VrE|~XgMfh&7SvH&z~tA*q1StO>W&+p8KMMAi+*qU8y~rj5vBL*og(M4KIx1 z1NzA;@2u6!cGgM0-WgiS>G{vLdfKZTANnu~jZ#f(e~yh)KV17Q`=xS=_KlY!)ktL) zP?>#|t_@L7)A=R+iRG7F8!|^ggYx$HGZ}i!0$0;dC(L3ch%*NwjRfnOexCHdHddx> zkPS}Tkf|kGU{~kJ>s}Aucg6TLckAf)35I^(dH=2_KFwW3sk!@aQEKWaN=+%E)O6;y zy}WYzl`5-k{8+~8&91K|15uZ)O8(Auxil(fmlxWizrL5T=3WN0U-nWy=I^WjuMrBo zGXF|tx`Sf3*x?0YJXR;kF2-c>t=AOK)>}<{$0v+-)>39mO+751u7K+3{*sZDk?_34GwbzOkiS+gzTfwUgeRr_{CxUd_yMjC;$yuBAfKB+k@=6h# zOz{*xJt4ei6ON?Ar=&=I(p@pxT!&|TTYo#gT9oZGz7JQ=g49D?p663x$xBm`PWFFsbVYubm{{8RTlt}@0;bS(cq(4?R{yxTEpH;pkL#s#%fX~aC zN+nZme;r51$CbD%de3vDL@@1rnT-9(Y;)4PI{^ zJRrT(3%`A5eq;85>7cc)bUUw;e{8_-!Z+U+{Ahm99td4&zCt&_PjNN=jMGCw&cdqb6%Syk^! zDG77RhX1nCA-1Ag=Ad&1_k!*2c{iW+29p-i`Ir>D53zLw@WMP1`@jW51V6;{1FsCX znTWlbq;~Oc2`Pc0P3xP%fPV&^pqWBu%rRNfBHCG))mn81v}q_GwgF;Z^g9h8Ty5%|L-$mj;s&&Q$-i;t5%OKy z&a4imlyktj2lTzDE3Z#G_hJvFL`^HSp4RkYmw>Ys&0bp7^Oq&-B+>v(u7<9&{0Myd z1;K-g99qPEd~b1wV72pdo-{w{Wm?EA03mTdF8Nfn9f6&SXgfmoEwFPTix#qV;RoRs zk_DgFL9bOxx*k4BI}kB#6)8F}=#X z-0_;4opNwWREZq)0Dm9juT;(?XKVdfb+l-+aQ{Ery}s)<_%&MipQo@_z$1u;_2e5N zI^TPchPWWBf4xg>Qfpd z*aO?N*=pHzYY;n5tP}O^75RSx{9dvK4_x#qPECxPz6scd)9qlD+O?v22cBf>Ak&Yh zCm+y+6~)^R8ga^85xzaJhTa12R-~2yJBN#Mf#Ki|4+nR6IJm>Zz#Se2?(i^hhlhbX z90l%h6y`E|ZTgUvrN^5NmBG3nJ%zrUuW=VMnk>Ft)+4ZPDNqp|yf zeSzENSYx*WW5BJZ0zKo8uLUs)8UWsOnnYoEPGbIzh?>O-UMUF>jDtHy4 zt%B);qkusO-mZwxOoAsAt)d##%HtPXtfAy7Py-)G|L*n94LfQjU9pwr`h_PXKPQ~W zLpJD@4^BVnYkDF9)oM9(dLBq+7oO;yTdof~DwSWGPV!gB4bs<&z6ie=XUbt&1Neca z`U>O^LV*}f`#reOGCXW*RAd4-tR~|+VS3mJ`DFfEITJP&TG~Dt3H)oKuiG=hL{T-_ zkSbG8Q*Va0_3?!2?5htzI$A?k?l@ttFFk(zXnk#CO%wDv89n%)_xZLuT2Gq&((L_o zT>+joblP#(1eW;<717kPR`o!YAZ+#yN3 zw3#ep6-~s=n^5bDNdII1R*JttT%>YSc}lcpx|w9}#}SK%oeT-Qrt>f0Tg;Lo6B*GH z$xrVHl^I@oy)m_R!#^*)>1y=)9i}m+NP(S9I)EcpE{*0-#D5;4TK=|6vo{te0aYOQ z)fi1&JVreNB_d1}SbvhIV97@?u+SHpn>=Z5e#DU%8PbUsOg8L4QxAq6iOGs$I7U1* zX!QTBb7(H4JnB?@qKI}h6d&;rDh{u51JO2S|-ir zYK$}bcsbxsURuV%JKTQr^jg3jQQFbV0k`GP88ZR(yauhWQE5{jVMf7QkBvJb!MmPo z+hHbuEypdt>0z|kF5 zTTV5rRxqPE$g?$ZW7+m{laS8~7SH$};hqKJ59XL zosfC+%d!AlIj0J2AbEvg9G5*Qw>H-mS6s`_=6u9=zq*b5T1r(R%Bi&01le(dCi>%? z%iV{TA+zBRklMt>UIfjGYq+4&xZ=_-e4cE}t6`s-b`4r?kh2J&r$a$WhH!pcO}?-& z{>iLSjl`M5rP=UAOx7}JwT{$a4eR%8kI9-1TN*sag&*L3IKL~<=@RK;XE-z_4INt( zeZ|v?D`HU?Nf5^v#W*+{_H2fvuwx9QoTKoq15x+Jf}UzLNNsQx;%o#PFDVs()X;X1 zCagYxE9qp8fj+MvWM9pY91#tOqgpnkLAP{Bt4G&Y?}A)~?HFT(fA6?dduUtlV0bjR zDZ(v|;1KtFg2RmC1P9kKfly&Pgg|H^ z1VZm15LyU<&^-u5KAr;y;CVpQh{b`>#tF!}8L#{SPXm%{K&sUn=Ca!&^!37GnkehhuLW+753(+=nEsi%W$RaA>Qo zFo<~*oIC2ZCLZH$%Y4G19sj+2($eaQ@T<&f;f;;es*e6`;-Q(ACTMyrfd(Gcx8}UK zPsMF`k!ow$k5k$J@su_Ir?de$r47I-EfA-)K%CM7aY_rs$ybAuuO@S(K?98#&1{J( z11C?zHxStij?kE!$X;*)WI#>FFCMJ|ujNYZjx*&s_4O{Ma|*cmart&?FV;>yZYUS= zt$ec{SgyLGxin9@?|#}KN>SpPH}i>{j}2HW>h;7m=kc%Lj!tr!xbPx=GRKIrn7Gtj zUeC$JIf|gUTropz>2tBA&&8HL6I=T1-z^O*ro4u6h+Y7?q+i8px!aw9UMclSgl|%LPW9Lk<7?t<2il(d1uMY^C~-Y(iAT z7G^T~=(34DwLQQI>8*q-3Dc9Rl13$OOZK1g6y_o(tINapAn&L?zw^N!GPoKu%@5@Jrr&B&uUcjem9zZKBe0XCEre?9O>2U(J-NY;b7 zjmyuWQn5KVA!}SR>rs3HI!)6_Wcl06v&bsGR zA@I>`RY;!la9)O9|Lm?ECTDulJrNH2`Hl<|^qOv^F`ZG+A7NHJCE4d{H;rY;S|?@` z9}GM1M;0M~AbOP%Ewth05?S;AEEkdLrg9|Bi-t^bH{#rq|HSF_+vVj}S41;p*0g8N z_$~$~WE+>j(7K4XsM~eVMzFfuPqJd%+qhVqZtx~z4aJ;&D0eji4$rP!a7z19Fyr-l zNsuOcazrc?F;DxKUu3vTB-nBU@MhlEYsU@3?i)!y{vw(m3~d{e2tGXnt5AL zTwN~2z=9iRZSZq2)*krPQU{(Sh(5A(kJfkhp=xpibb=!8+n;XjO>2L8rJIM5JCkHkTiGOIpKmkFY_)h3Jc*@mP1{ zuLrTxt>bE^Hvwy!#MS^IskJ@8rf0$ZQ;W5WG!=XQ=vJHB$~+C)iCBuDv#IU4L$*Jy z8fUJM(y(FT&`0w8A->05p2hoz<*!LSj6db+A)SWe`mSBV3DQfjSvi*E+N7H`9h`~C zGZfw_=G~?}CF?NB0ZBN6Z zK_)7qBCjrx+wITAS@R%=wFZ5Y7u#)v zCos001V-D>3NOqtY-VXca1?Uf7lni3Eg>FS2hX<+?YFU?Q=8+q3EA%B1>_5r_O^JJ zX#3&|{l=mgrfL)FaP#YY6}I;$V4bgGFTQ^T=ep^%&O05ri4AGpq#pzMiBxm(*MLX+ z20dm^7^)~o-`0Rj)Bhy(HvS*ULL=prqtA;PzVCZW{2Xi959hLQn0?^G5rxbgPb)#IODDUBHFY$7{>oDyD7Cd%Z|E^5u9PUB8BgT5+ zp#>n~L&%Mi#%LU@x@K_|RO7T(6iwuT;}vMTiPqscTC17iw? zM3HZr9?(rzZx?BN;7!0PZICS|o6-9AW3NElRH`AhnAdWHq-V$XxcdZ=R9v(_=q&ya z-y<#`eeb@8?+4h_Icy`&>Qax2-^cp_(zE+JvU_G{Y|vSO37HqB^5eX>J>mZOnqWexT&+#(~I zuQ=u0kJLKNjtGq$u3efPvNfZe=IqdpNAuvevhBwK3#qpFV=wLlmGp4oB;B*}DMTqN zyRi#?!hJJ--&(zJonp>t6~=G1O4DT2jE1i<7+bI`gkT7|osh4{tK(8X0FEz3r`BIBjFyD#j1{?I5ovuqmFF4|CGsgl zAha{V*(562oDteVQa$=UJOk$$&wON1eD4UCo9H0%FjuWyaCAbBM0e`GAKLQHlXRLF1o2oU&o#r-J{LUVTdkCUk5Zi*_A;OrHJ^Q&q7ZQ_vDD;kHKyIRlhER z#*y}Wsi$w@pZwo?o!U-xhvtJ;a%?^6Bx*r>iJD34-F3nl0tx`?MR(QUCWBAu*IJEMgDg{Wa1H_M{Ku z{WXf8DzzP3jrZR*JxbT${dYubq<+L6#`~+%*uAuc=;qBNpZSD&(#$mc^R<=W*@Tp3 zsZ`+Ggp8^lR|CFIF!(ybhj6C^ZzmXhoZ#AQlnMqnCwPA@tmOuR0}@)52QE(tI6{z_ ztqjI`rY?0_1@-7qOSXQT6GTOS}#6SrE@$hVQ^<2?3ua1bmiY@L7Vv zX9)(MB^Z2`LEy6t0-t3NS{ao2)WL!CK@%lBn{m!Iejw8b?!?4Hu80|Rbh4gF93Zq> z49(&p?E?}=YE(EmHI$N+M%ym~*8icP*zljF7w`M47i2HU&6vV(Tg6R(pGACzDN6b} ze=B_zyY<=o`0Wh;VxtkcooNNQ;ab!|`(fi^aYZJsHC_{Kh4QzNodC{+nzhCom_s_V z2UPJ4r-8QZt}6nYq*6i4A!5b}St7iH3>?mu8kFJqzH$rwIKO=knQ<`u z*uier*KTZMY<1mk0lu%#`D{}z%fAdSco!e&-l;&8nkeQtla#;F;gk3@IFIE*FLcw= zetEISuAIQa`i6;2ye9D~J6)Te@AXN12GJfRk7V)H&v!cu)Z(aI?b4|7vz=k`YXdME z>UV6es55(w-{dQ&nOSS3S^EDvH_-yk{0ZL~_L*JJ4rAIJc zeQ8A#bZxW7fgk9KNLwr31S4GSL)t{Ul~ZfL>r=N;&*Hz3ZW9gZ|9+bg_0%Ksud&$M zaW*~`{!L8Q${y*4vgXs)%HG*nRoH(9;v@G{81?Zj*eQq$`tOCqeGAM5;Mass*C zpuX^l3+~1qds!CNS7)lQ{B0}ZBgsSfux_8IlC2ECa;uNTh59wr$SbaNz92q5-PXvq zWMwba;)e7mCdV1l4W0=iaZ!IDOl{^#B;YSRkX zr)_~ZS?1G+^_{MisK#*k0+HfdK8lJ&akiHpFSrVbf(Lu^H(V^@pOA$(-HIvpRZMoW zK&R>oKrWypCI@>~=bo;IkbA7#$N9msUp#W(h=5|^dx|GUP51>FtXjaKmEVzLzr}o^ zhHR|zZmJ`#18~cA26o>iPo9Fyx#iQ_#L1a7|B;73>W37!0B4jeTfwvNkJmepFfSh~ zZ}!=Zl{UY}V1K^l=LOhp1`{7PA{Jgs26kT+JnezA?+oWUGr#s_Hk$aYzxddKA0z#h z_r`ZUYK=y07q+qs%)}*XoJ#$tXbFIJq0RDxn|zKtm)-x-S@ayV&y&$g+FE$Xz=@4l z2&@Rlkk<~B(QP`SA>A1wkS&d7&CzJ=C^XhsXvRDV8xPSkA|e3mZD0p@9+)@kE!R#f zBo2H9;K2$P?%<(l1<#uB`?g;mWB7G{7j04rOI-Ehy4Iu~-oCHGA|#Hn@Ljikf+lIr zgBZ=>On6|n9`6n2ub+cwza}Q^Fiv>pY~_bi3_q#l}g1gs`J^{&>I|G zG!Fh|!cWAk3vCP2N2T9F+#QPQBHailA)YaO@j&<5FH4-S%V>^#J~b@>;={+wL$f(`bbR? zCk7GVfoFBk9?VPZcsDBI0;5i(6S-2uzg-C1`7?}ct_gQyTd;*0nt35#Tcl(SnIDOI zRfsJHT`H;X(w$p^KyPK};j~lX`CfRilYv!k(tmiQ{cy3mD%)I793W6xvIfPyw}B+5 zk98|BU!AdsHyTwMiUJ&Io^H7a$uw}Tvw0`Y;&cm1T_if{_?Tuf1oyQ#@HMH-jBkn8 zBR;pJ!X{Rw*=R&PJE_)ytl#Q5D5ea@`jas0Y$f&7(M|m8QP${-bc@$=YL?dZbnww! zR%jK{T7IVQTBh|&?Yb&3b0OWnz)el~cmL9VsLacBwtpg7B}K%Voi9M1r^-aM9G52b zLy>o)Sp#m#MmbA-7meeC<&}`cnMVQp$Yabq-QZ~>zxb|mHV3;GJV!KS@QEeFy+j|n zDzW18dzg`u9acmvAYts4zDezVxf{1DM7@M&>v^gr{?@XyQrak`e_q`E8o2lZ(Pb5= z>P>OIX&k@6msF=#Zk4#78pl1SiR-ip2~4tp(}Kp~a;9=WiBf!x`zPmo?k5#$Pu)Om zxbrE#x+srqS%aDCPjW}eDiZw6!1j??2^h~0pxUGpfiX}zK2I(3b?7#PdjmA-F#9{K zrZU)3c4Pm;9;pdG6e#UW&-BGMaevjMRu`E z)ygi`c%ic6T}jixx$Qg2(ofU;qtnRUvvEljO-18wbxz~%FLsPxnS24ZTSDaJIo~Y( zTG1T+?eudq&n`IqO2d+qZytLKC%Q4G;H#s4Vk7Qax5~1?dzf^M?$W1RXOJ4iO~P}h ztDxguwaJzZ&4vMO{zrj*t^#PiY4UqF8rK1{T|GBVe7aJ9jdc1n%^#O#&u+aYP`N#y zlw})mb0SPC{=6*v#WtIqZZW_zP4Q=C*<(Aj;Mt?59&Nt_<|2KgiEl!bAo+W9{*ZWr zc-<|I&1Ko6+hw??_P)di{W+B0h^O+F@S?Kp{vG7W1NB8X%F40_wmm$vx45lk*@0-A z+G^femd)-u0nZu0NsaqDdU646wKy86$9uXw<8bjG`i`LyH<&pSAKW%3^GUgUqe(r5 z|9Lz+F-Pn7i(8mte?Nz9g&%BK`+U?JdT~p~yY>sqWZHYb1i({Swi3KjZX`Rcb()Sl zAmjQ+;}#o`X?wRf!1=w&y%M%EM;YmC9C1QwHQ?GcakaZP0pbI=XuI+`89Pmw);e|K znH_WaLA{Z-{s#G57B*2ZwHoc_N*}Wrot#sY76u&-R64Jl+!CbRC8!~gixj3Vo@_V! z$(H7o7T&O|9>Tw;M7Si|{rdsVwyEw`lfB5o!XFQdxZ@=q%wpxn{>~4sKhT`Ap17 z`yM&CeeDg|qyZ+Q%#0tA6UcqHA><#PoY)_b6T)5Hq#-^!l?kAl!?~7!Jj`)XJ%cD` z19TdxOat)1IfT2iLF27wPb+eQxGS49T1Abt=33I)kT;mSRBGO<5pRbrYk=Ws|I((A zy&)3hQ$IpZ2zT*}$j2Akzlxl2?z~uryhgXUzD3R;?)({14k5PRjGQ4{(;3x@5UJOD zt{^9fYbrHw@U)eG899$}XS`6(KaaFlOp8#?KUbE$dN6on_1r)0v!9pQ-^E|S0Y-bf zJ3yx>ltmX_IP8U6{2t)_F$wEp5Awyn%zKdE`plVFJ$>Cpc(^XbPK17SHWZX)KQonI z`<;(a%_g)a>A0t5khm6L?`hG#dn>^Ch6%Dj*p2?o3%)e>E#b}gQr?_(aaQvD{qtiM z_`Y;+%9~R!PEDS+f7%>j>w+h-uTW%ZA;T^d$RJy2Dn(uHwlQ-+0Zt1JuK&<~+PVI+ z&A^FqXLRO&Fco;e=7$}4zj(4UfNT81BX>+bHKul44e@S?!wlQ(6IRoX#4(BR;54XP zfgMQ>?a4FG!ZS!IovUh|@30j-&De#p@N9sQY1UZAigvT~od3h{R*&ywO~Z}R?O0z% z$`7~!EkvTa8+%ZjbfWfX^CcP=r)dJd_flV8)9y3Qa$ErCTY!`YoVGpRlEkQ6lFE@x ztB=+nX<6;giab#!#AHPa%{-GZirO_?qeTP}dltUfL0 zJE4!$<865l?vdD=JS{hz#hJc`>h64OcIEO_h$b6C<4XMkI*6!)AKdNZ9l;FLlhiHg zfTrS%{(SFE$m;w08j&J`Is?@ArPIw9(3|LTgc<(bM<6(BWGkWickh7xfrFb3qq3YE zKXr@vuV?jY4mx*>Q?zZ{LmE>Vq4jo8Whp|`do27)GB_WH_KN`D7V82*Xs=|I3 zzY87#@#{E1dY@Y8Kh#^2Eh8D^bp~JtxHj-eXjf}zJ4D?MjqCf+wnp&`Gy}3noEgMk zQjPi7sixw;e^t5J5N4QV*k2TOaI?W)d7Y^!T6plhVPes|gZ9dEOwgo?qB92F_;ZL7 z7P9 zWyyU?g>mq-R1`;iosvb7z&L1vi>dU~@Tk7!oUZ)c!@w7ANzQ!0# z{F*z8AuBo4!QiL?t;|HrA>|I}5g*JvmWW%?&$pRz7C$}35HhSC!N4|2?yHE>wlXo* zQY(w*?}UakF#c<>DV%XNf+II(0FHJ!6ZT->&It$whpJ4VE zl0SMu*@HfO!_htV$Z1z%sMo?@7I z)TTDDf@zXkJ73L?s*MWjVx}J=e-6pH{M*s&nB1B0>rf5d>*+$&z@e-M9@8`bE@y0m zhcVhgBSC#$VxgHLLMmdKT21A4Son_D)l-=jBmrGiyk~5C3U(W;5KZhi!`o!vz6xLB zQw&n8$8-3%hp{_y{!>dWCRv%B(H8y}_yKlqfv5fI#LT%v*@;`IC4SMXoVT6uPXpV$ z?d&;0k-iFl6YJ|WKuufp1oH|sV73}T8KihPUCbmrcEoJ^}+g)fcuVA$Q`*VOje~@92&0aBx)#W#!_HXodM+0LY z=SJUtHc(m@;6{r-2P~0AMPFyNzsoepVi6T^wrq?&V3FP)?`G`*ooF$Q*^Rze(0_Xc z^S9!`#j+@+d~2cIv6Q)4__t!aqZU2EZx!|A-Zq`1l)1MJkSwodY!4owCkjL1HhYBv zJ#p*p>#v|EZm}o!^$!e`7JG90LBLi2s1er@p=&*QVq*C-{xSA|Q-()9X=cmOlUfFK zSJk2?e=N=%Ws+w`TF|~7aHth~Gl<1}R@Jh9E8boBhhkk-1@nhuK)(vmU*is-oTZE| zpuwR1n>)a6UaDUbpiRv;%=(&72^eN47&~rCBR5}VrSGJ<``flZZ|ZvqI{(KFwm%`q++s(40{G|eQRuxVX>(qUDo0+st_vJOz>2I)`uNkzccZvV3 z2C>%P@h|y@NVVP;d#_tp%f@WBkK4ukakFmXdGnLpZe zG8y{xbAWZdRM)I;WTPxT{9KvFt^hubyTaHNSRJajm@%7mx}#WSQZL5Y{=8Wi|Gij~ zecYG8Vi7x4UwW`p?AI`*Z0cO#rk~iWFFC1K=GU<1?fbCOm1h~JoqZ5H_KU5+!KKXSUr9J{_6zCvL%ZF4h_yTBFkN^WAU-{{ zZ`@{k{CQ^Q0g1w_KJW+3$Wiz{#9I2Yf&n-2;U2RSnixm=(!2Gbcj4T)5PjGSSZ_X= zBTPP1=jzO_GdkRJAy<~oddWWiHlrJdIHUpl^nkUjyht~8A7fu1V6f)f9RXNxSZkI$ z2747?Z#iesjcWiEX)tVr&Fgh`@(Z>HcLMltlw)*?PQ7m25s@a^{h@O>w|1Mo@^QAj zsBD|vzMCO#qChj&yr+R|TD zwpyYhud|u4ppd7PBXt32%i$8K*@L38B74;*pccD}?B$gnYH>~vYJoG0So8V^QqAL0 zvq&u-=xui%NHzNtrHC3vb%Ro#_m9?rT6pWWTbfzaT2;yHE+U##$s7`Ym8|#o-nI&~ zdd|~oo!Dv}T1^9uqE^$er-ZY=ZZ+I+RcaL!Gn1(0Y5$1dwt5JyK5C^xZ1o(@W7Lat z80*a`bGg(KB3jUx>KL&_ zy#FI0N@Emh;QH6~e@2V1V{Jar>#81S?Up)F`^ODhV1|elBhL}tWBG5DemZ|(MHQk& z`d1rji|i__=*pu^`R1EN$i=U&;wV}Hek-&rVWUpB6p_nH^%HHnv89Y|eU)CveWbVV zt77abP)BZ`NV)8l=W%}G3?JrQsy7WQNirLQGsu^6BX#FlY6KD@fJD*>ibfG zvTeGG-AvmTgjG7n9d^6@0Y-X zJ<$Ba8V?E6Z+JnrtB#d@ROe$?C=B*}7#(&d-8cnn=l1G19oAWn=+C^sXTzVJS*L8# z>ng7y>S2q%yl}(sGIuFucA-|U+XqTeQHv1|1ie0|KY_1G^|>ZKyOi1Q`KnF)s-ob` z?~cBdxf|HN{w$z&mg%2wAG;g>mne1qyY-7LQ6JZ_>aX_;Qd>WXU+vzOJ6GrbrT&lG zXjiaTRnfV{FnHUfBHc4@F_Vh4f4UQ}M2T-p>)6cQSR3u^sQ2sq4|=r zYmpE5|LM0L&ol8kw}uHOUbq#s{2gcyF*Z3D@>&_`NEN`kTL~?e1V*b)knsh#o~dji z?-hxrS=G{$;)Tj{@<}#}rDN7n&%1HY!J|VU?iI7nQ%+b-*om-9VW(_x{2g|NG^l2s zK=}y^PaS+6vZV9#&bXMgZzo?$7LM)s)Wm1pispYTlHsOPD@QmH{}^UhNmtsRxx(<&`pQhW2Ly^f7LJ~#1eZ$*D$a(;NLQ|fE&@L4s| zlX%OkA^>@a2gN%j4J0<&pK~-oyv1cv?Gqm93{08ax~iucPF08cmou9;u9F z1T4mj`uo|it zQ2C#SP<(Y^b)}MSgC01FbB5l%@d$>drQSJ{zE-~Tus@E6{iza6BdY&eeV|fm%d+I* z+%1wIeEp?|Z7%Tk>*3saTD83Ls8!3tW!}2xKCEk&r!K#TbxonV{2uk+gLQ!Bi+$>v z{=CC8-%opIKJjU(E|V|y*gNxePXk|LsZN@`|1|TpW2Ab$GjAHb@Knh8%lkZ-^^~`M z^HWqm>Q$&1o8^gqf&zE}ND~Z$E=kyg*&PL+Fe5^076Qi(z8-Rl@Pa8_9BKAbq`f)TO9@fXWBf=llr3;lsfLfr5WNk& zow&69;J~)g(+p@8q9>+HHR{CQGnCVCoUGZYHcGjULE5W=MkK8D_VoVNl8m@CVM)j8 zR<4XZ8~si4>FEtKPb$vE!0O(JP=6UoHo5*jB#10u(}RfjzM$H1&`3gUWCwQ_k!@09 zW^JA2JO5tNo5|CtuE~@2KDE8Uw#r~e_vSrF^53Srl*&)Fwx}#?RabdpM!iO5>+T_# zb{7A%xGOAytf#|j1oeyZ`G|4F+$Y|e1TnJ4yHZOqYdk?x@p7xpSECW8X!~`_FgC~; z!SC%@H(8rq!!}wn61hZv+Q+`rYWcUn^+l_Ylllrp5u(4C!Pz1-@(;j1QG{Dsp$NSK zg6oX+Ubwm-FCHqsZ`e!xZ>mN5G7VlphO|-Xw47{MsZc&Fb5I}Ku^F*;`1E>+U zmegW|)>n|AKI7VNp`JKJvfqO>=ZC&GwSe(yNA3&fU(i*yG1~FL%&PU9O}zG9c6T8s zKdl^F85IE?73GV*D;)!mEflTfi4)d4D<+H2D}rs*9xGZ3g$^z>mJ(QCQ*%NM(P+uq zXKlJ{1jn8<@eNA$w8^f#>%*zaicWmJp<&ZE=f8=EnK7kO<%MYuokim>;eCWvUiVb>c0QS&&kQjAs`3@v?y346*RLJYb&#BF#(bz zXw`OJu%#>Z)cUcXb=7@lJGZ(K4%`kh=o2##0tTK8qE|c~K(8RY3$qTMZ6!`t{bpqVw_=w$_*C4YZC_Lu zhFA#yh%$}|4e5&(;N%wXq71t2*jGGT;(@#|VLHp}Us(*~7%e>aB@K*gvQc-Pk#42X z%t;-%pGI>kA`q3ck7y0?f%Wr{hrAh*ehH^|?Ndu}9@`vTL$5a9jh+>lH+wXwATxrQ-1M+>%nhLLu}m4KJ~kh0};pQxd_G>2j_4gNn)d$M-MuUVb6*?((jk+kCFqrqpW8t z{^1U50G74>&Kti!v7qmbEQjz$!)4^dsijQ(e8IWJHMD1_iJet~UQ2zoVrKU&WINMw z>6_N;>d~~)Iekw%p22ms2h2yF0j|gbi`BDu=AHny$XC}Xn*RA_HJUN)LU;yI2}J8? zwSNpTvzJ+t+puy~s?cVhZkF!rVOC@X*4lwrj?dM0)Qm+`d{Tq@HpQM0-9-ueLd?YB z5^t$=MU8Cwei``6|635~(%N{SvuB$oQ_f2hUg|E3nqUw^0;|DnXy|4oVQAO80x7MA@tCD!iz?@QDc|2HL8zW3jk zm}UQON-U`Qp%OivB-4xbb(w6ZI##PEOXb^`w#;>Ph^T`<@wjl(6X@*|Gza@xR3h*$rZ(x|w@3Cg=4RI75Ob6=H~UvVt^M!M&I0TLG*^4Pe|7?W zBTt#59iCYDAQP&iY~j@*7TOzRsXZ7I9E`tuKMT0#h*VhnJALD=7}wuOhrN3(jIx&3 zD!8>HJ8I@EI@prdx6FL>C=e}AII=?`$wydp>a)X|7R_gx6Pi<+FQ%SG%;OCYFm*|S zKrGpb|AEiZ}uEZDrXNS)=a@bxdtb z{&HEZy7u#z7gMC@bXztzN`K-oGu9UBI9k80VOdk)z9QG)zId-BL(=1fMaf@KE95He z3Cge~)TpOVXbx1nD2nm;er~Jwgn#-=d20{_)fECCpghr?=dV9( z_W*h*{8BP=&_RpPf3{!Wr4 zdo>L+7a4B9_P5L%PW`R+LZn46N}-n+y6b`t<@k+1@kB(UXQ9>8`2Lq}NB0#;_)xiv zd%r*FF;-XIV6DeJB&QBG5)zfXpXz83x^Kg>^si10eOJbJ+h#-0aHO5In+<#;vO|7_ z8KB}XxcTc0N`r=W|4q(%ow@4SRWzok8oPF=CHg*e;)!boSi#%Nt3~Af#G@wjny+tUHzbndYd0PmSDg z$fKqDWqrH;r_0LeH=%L;8%#*UfZpK zcC7IY>c-9!bywml@&EFA@D0RuRIyji)yP$rD~&!bV>jlFJk;Ob1)}syf9IyQ=`ZUcpke+!UErf|4r)$(0gi2wY z;MBNh^;mX4x?D4kU#|IhjY_rJ7n+LfHp7}nSog^jjC!r|Rb%3I?7b8IM;CPD9u2Pr zCT}#Ak~V%UyZccG@LhB*b{myB4(okpjRUjT7v6K@?pc6VI1!ag{aFWwsT7T>+H?zMfo?$UEB2Y7kws6T>^#X@Hn z7HTeg95$?$)vb*01rM}dLgq{B3eAt7vaQ|&Sv-iIP}Jn^Okv!G4TsYDaQCpGIE#gR zZC;b();B--l#MW30yKNzQ?}0>z~EIVcw)ql;jNCzlq!le#ln5}eGEF{{Vu*XO6wc+ z$Spa=#S-Rx_dCYXeazY{UABrnKNr-)As}jN_3T@AvAHHKEj0h}XPJ_Dp5m&2z&NOtkq#q`J%IYBMj8U|ap0C`X$5_R+~!E_y8X0f z!gFXX(UHmZfs2lJ>qc01r@3ENDRkoZZq_O}U3|48{9N!F8i*MlgS&?!wOaI!`az>F0BKb?PTJ9_@}l8F*uN-bu9-@qzd=jv9B7 z<#FzG5yzc+3A;73e_vkj{`Gx~e6omwer^W9St$tQYrF&vt3eJD#digKdU>zqcrB**W&tv$;0W{Z;K+Emgj(vCP z*>!zSuvB|5b~(SRRQnC&|cApz{#OSPPLTl~c zT;7AxQI6}FrTf%6+P|B*5BI)Zy2tPh&q{+s7{fPPIoBj<=zRm#(PzhGqZ~nFr@0b8 zXAh29I=0{c{ypWh#`pWn|IyxH`J>9H{N%lR+^?Yznv~Ih&`zbOB@T_H(v=d~VIy$8 zzs79R@O{A=vp*Ue=+(NB`aP)0i0)6&2jRLesYLteTf6U+IOGT&t0g9!`Q)Awho9LU zEYV_m<&(fTjkJD(5+8VFx4WCyNF~8}Z;89S*AN&hi_o_-SZZCU1z+f|rzOJiNw8FQ z@S5FfsdX{iQEFXO*(d#@Z@+IYm7=uVqI(c^Q|oEbKXGq~;S=tZXc?pr)-z`KZp`{f z{cg0J0pCN*>jt0Pd#6PH;+;BLLayWbU3DCAeP^(a_Sm|eY8@?x=k}t+f!4kHBT8x4 zFMe33uG*`8pQ2y=9iLL|UCLed`sKh~`#<*Ky}EyH-HV!p>C{oZ_Wn-w-MYU!cA`K3 zxgD65IR_|OU9|w3iUYh(zjV&hi}DuB~i_5#~n%wmvJIIWkFXTJze z3+wXoPF$%M>SS>5mwE^AIUb_hRoTF(&}!Nsjldc|I26d}@B=A!Rima0yR>M5x-R{p z6S;dYGSDftQb;SVWC#}7VUsRg(oD(XyfI9%u&sQY;L*s9DGZg#+6)d$`d=x|Sp)ut zGVR$E*BWo8-10OgZofP#i{rc^qwkcxvl)9<+5W6aYOC76by=gZ-woLX3ie2adXh9M zDr)h6HE}^;3T0&|Sfa%H>{<3~?0y0*2e$L8{gT?4LbbHop6rVbWVdx`Dv+xnIlHvb zeG0mCWQ!-8-e7}*(c6X5dt5$=xKU)K&nphUER9T8-M6$|2TLj*!TFd-@WM6iOyR6c{ zE=?5GGeoJUrb|Z_TYj!u%gihEMXnVQL9cn3Tc5cbyKnae>RGc|ttZ#&RPJ`13fx6a zk0>?bTC0>h=Yn@o*N(s)Cr2e7|03`XYP-}!eN8<~eX0x8v%Q1Oio3{dVV_Xzod~>% zpuBwdbNOHKSy7jvmpopvpKBN#kj>0r{_xWUZERLT2eoZoX51mJQN%1180occCY0Cn zZi%Ot&WHli*e8SsSK7#$S=bZeHOD%9o$n8-O$FShhM?E?Lo+ z74S6w6q{{Mt-*zP0skLqGqf^EDq86$DJZCW8An1ISLC95WTIjI$iG03j)cZf))Q4K z0tNVcd@a50;d$5vuv(ud-_h1jmX#wHv4%UvBZHUl@m$EzFK3kefS*-6cbU1FgzcQZ zM$t-INtd#+?jqrAgfPB5CKHm@Syps4wPeKAbKW8*g0F^jEQXeOPh{GgWUrG+FMrGd zKbZIAL!_e<;x_g@eJ*@IWpDb1?XnthCRa5+nXqz{-7T1P(ux?m?0~w}g8^(ARR z#%j+us&1%Cmkm9zw4+CJYHv<9xwsL9UAm@a8L(%h5$8I?Bm=*`L1E^aHHNBh$LvdpY$fL`&{vhol!e-%4e9m_SZ zeimAwCVs!cDR3V;uinrgR)k8RxBfb9S-EO)AS4*pN_CH)6JJ~AGuP(LSwH!R>?o1S z)7ZdV{O}deF6_n4YnJavh6iVAT2PZ`b(F01a-!8hEub+$JOLjnd|bXB8kp;lTqT4q z&s-Esm*GrLQP z>hB%gT^f@~N7vsxiT#pPn^K#FvZ8Vh$S3BpV_b(blMYWnE=Z_DcT^pf#K)i`-q~c!peH(ojz>MLaLhu4A4$#-%i~?m^H~&geqsikoqN$!w$k0(g#@+l*ghXcscd zH{*Y?BhHrO2+Yq%-27Z7&Sv0W437UegLBJm$_*#pLiyqK0``t!>SUu1d}!tZ7Ny`Q zFLOAb!FLSK+i$TOhi-?2tCncKN~@f%5O<&zxj6*r=6Wr&8GrBBa5Lwzv`U8aV+zZt z=ahBQemQ9kt+fo^VmCaxC!badEGU?LY25{89i%e>*h?dJQvOBTe*eN{OW?sx;WN@O zFWt_nlg0;n|EAhF3CkkAxXnUX7PXmjt5p-kv(TOTxFn|q+>a&O`-j*sQTnOC4A*XG zPfJ6j(V&P7$2_-?I0HJ`a>Q?i@>ttE=!w6U31KVOn>YCGel9ieT+?0874U4OVMz}x z84s{yVQY}$E)9^YoQ8e-c~M%~8De<7nK4Ge&%H!HaGuYNEkLE%z6iU>&tE!tcMo`b zYqnQN@qn5?}ke6b}>;}hn4Kw)05d|{F-a$s^`}xQr*%a)MjoL}V6Faz883l0$3``))-7)js9P9W3A8b|9`kS4 zAE4_EF+P^R^1U~bwK0qKsC-?O1yx*mqGw5mPblk;Mi$m?j4FA{6@0-=ff?^=%N;&{ zedf~AvHQ6u8!LNfv73bBr6XR#j$?n5mU%S~($OSorI$%Nwah%g%q8pEq%zptbOrg+ z1}~zd;00Lt%diCNf=bTTjFobRSz0sPCav=hFciJSj_`5b*VsnUP;`lrhV*K=)?|&0 zza#<38l`fpO(UPOX)=UO!p3DMOD%G};O1Mub=c};=^N25l2gOi z0<(|lX57LEW;5deMx=vJ5AcD+6Ds{Bx;s3pL&4GnazmlNa@E|Gc&m$1sf#S~@EaQV zM--e8)jlhGc?PuZx4l}T>yWgBM9#=ugqMi@wV}{?Tedkx(7&~pG#3ZIGJ7*>U}S+h zB|M56Y`s$h=5T)vf;DXPsPe`Kh4NO%NHw;`b%f+B7ayQs2jr^4kus2d(;)};%k^Zz zrnjs=_?Ed5Qrv%hYsDP(OZI!d#MH0P{ZHRHJoAU%X#ccr#(#Qa#Sgww`^owrc*Ap% zygDO@8yySs%f!89q7j(d&a4M#HH^@(*yluKpQmC!aiKxtX!SVP(Ib>fx7RE1228ILGZ2Gc9X{Wk8Dt8g}t_i z#`oql1wp&;Nh@M;u)itMnWh2Yl{}M3D`PtH%lpT{14+(ZxaCW(Ny}6tDnuPM^ZTS5 zr<0~6Oa~%OH*j!hUSNK*Xj4G`;=JBrvAl8M#qVUVaR26k-QSVF_TLeiG_{&~O@na| z%WUXy%nR~pw{y>am6JC`-r?js7KX8vclgG3o@twGD*m8E;T|i~^!6NkR{SJsT^j4p zKmI)1=)MvfQe6nE?gQ*(@ZkN}Z##=QQW#ef9#Wp{X9;Qmn%JT)gi`EUd8xwg>U@KqIAp2MV`JER-CKoP(eNljNQ65 z;s-9t@6md|Ck-xW98T@o2z`15G$L5=wP(wY9nQoYZ*m4?gLXIFQS^<~Z|aY(#u^E& zz%y8JcqTY@1!Z(yeX3vcQt@kPty05UoSlg2|xbO9+|x9vJLC9SJ0j;HHP#uPyQgLSX3kJgNO{87`-Mqe@PZyl^2jj z!}@2i`FXa|bA~h&{n_P{#}tl+w{?Vtyso>7)pk@~LMt?RW=JGw-RK{#T4bcpbtLxuJnf)fj7@Xm@%`%iUtP*I%jgr>xY#ruQ}7|QTGDWize&*qxMIF@)V_4k zbzCJKiS(c}8*^>xppOMr7gB2hUX9(1LVMgdZrs9NWLjxR*Z{R<=93GKpmzCRKipSo z2(dF6&PU;G&1QX3eLzBMcTX-kLq)`r!B%qH z5YZl>p8P+#rum7y7*%f-+a|9mm1k|$P+YTNo`8f`o%v*Gg%8IXRc1{YU$NgY|GAa0 z%vf2`ci)FMxox&kOL3itkh7jXVRET-m$HDKX;D$|xUKB3B^@ZnDD1qrTCeG^rQ5mq zOn~;@siS{Ka zkLt^>-2lcydk%Zizv}u7U>sTDk=|=sf#3F;zjNL>u^WKJ)~S(hb!s5vU>EBJibd2A zlF#MMV5h?7^`*c(VzyiDSMqZ0){6b|Nr8#atLS8H6EK7FIacg|-9}*Em~O|@GM;9q zRn&7|>6kZir9S}XGSfauPR`Q9F51+VVfV@nMa*{X3u{c}8Rfq$A5*?txWvfG4Jke4 zH_G2GN50?q79h8;)lq9cTwSl-C)O26`d+QO@WqgNZC$}$E&Wd}>ab2?{FRY!m{v^a z@XU(HNOppYp3vWsFWVDo-oEfXZV<#4B)u3uNR83a`K7z?FQLzQIz;1;Zib@L??3m} z6dF_Gs`nVVwMuVrOks>=HyIP{PN$LH`Bv%QY-alawRa01d8s~Hl>ZdU7#RU_;p?nh zNMWRsFi>smS?tJR)aRIotDWx93BowX>n!rH>VfF>g>0LVXsWLhO-|`%tEN$u*7a!R z9~E*^VVL%D^L8KC^b_VWhuiTZMz2##seDlO{)BPCXWq>`R?k?U={n5)v&kGE_1IjzVb;!>QH%BRN_}e$;n(Ap+bb23eM;)ZLOmDHMztdkZ)zjEH zY;K`b!7h}#dzcDn^1T|_l*LJoP|f4!HNLk*t_ev04ikDQ*tYijIqzePUf3;MWYSSe zRw80ZLSgwwdAxX1iE)sAj`Ng;6#Jp|VwpD@GSpjQ`Wp3{X#G&!4YVGiBAD%^e>2si zRiTPbJOis0ZE}@V9D7S7sc?iX9ldKk8dxWT-NG7tnR>xcp2kRd{e3{+LVMdcPBGR0 ze7XyL0rZwV)N^h=>@523bEW;)9=bBxY^t{(@pMv5ob$DHBD9uR#CWtnzspqrM()P_ zqu~We+e`L2lDL3pbHDm^^Y2kNF4{U8QPvcb0gZCFslM8Q_@ES*HkEt_La(OUnll~$TrrT>ysrohuNg*DZ;Wqw?qu#)UT#-Z;qzV0nY z@1`?*{uZEx(Lq}1uS|Uf95PS?1GiA?4q2%2{XwWt*!x4$BipF8m)!d0}~bf_wHudJ0mthG{{aydcAi5bRfBNz~#Y)a>7%zWXj$`{u zKKs-lzy8Z?19)oe)pB+k zESFW7*U||cBn=TVayJvs)6CDpOjcKOUKUAFWrw1zn=p?p@tf$Y?e;W0g?^^_jqB5= zC(~TQ(Y4Zj&e_kSJQ}q6-ZfO_eLO3bu_!ADE7qaMihXqrzNa_UyRe$# znrJoATC#^z`+<&m?IGZs(ONq8shlzyYiaWL*3zFC-?i#{X1%pLu$Bz{YiZ$+*-GPE z0u!|_xT4NspR0vh1FflY;l#$>&n^1JQTaihnfm3eIdauX!={F9_0OFC*{K&!yxc;X zmSF?W7BwBLr9J0g`fO@#b;+0&hO;~zwc)HAR=d8x`&Ze2YOUkES&5*t@x38ZOjsnm z2SY=#E8Aa1gJUu%ipjN1Ot>t)l{OHz%d-aT(TY)7#XiesB{?W^s6S>X?i6njpG)sg*8E^CWAMDaG9C=NHg-a9bPXFzMx*Ah2Q<*=`bvQ}XIZS7wv zsUsIbI$LR2(@AxNoDq!~UDYsh?;+Apctq%27>TcBcUXDkoYA-DLa)7gn-`_I^kjIL zR4T+v_lIdHCymW^3k4z9t&S-O$gTl(ZKz6+23>`RH!D%%um@yzh1g+bbDpaS9yziX zdxFRI><*7(O8?nYHR?KbfO8Ij77aO!aStAXd1qYv?NnnVY%Ng^R$8Wy!73Rgy(vWF z$)UHRW$)@yQXyG5uL;KJZbm8&jh5~UiM{z{|O;q7~*xm1v;t7HfTwI# z3LE^w-Iht>E69~S)Blb9#qi~dF5BSGfBW5hMz&CG4dsJbX$B-~E3_{7!{Euv-zfMN z^nOPkfSdz|10Dd1sUSHA@tJtq;Br86I)ey`W@Z!igg2Bs;lCnp)QI_Y$QbKf4sIJ_ zDqNnkkRfY+U@m@BUHC*}u9fn7UBc2*DXLc&Z$Z2|v|G|`Rcr0e&b-`xw$n5VK?9^= zt&F0HwSTpGMy>(g?rP`h49h!Dm7cCYoyA+-gTVK`1ZQ#z`eNbJ)otc7FMJLfaDtFB zA4O=Z7=2``&9e~dyu4k6-2+|??0Z33TeNd;(5tag-)1?j*u_6C2A&46p-^(DlWCh% zFgb6|lLhN1^UD=)<$x~q*u9<}8dusQbs_UH+0qp4sNk}xcU zFD$6zPQJ)K4)5M@KD|lPK>Bdt8_<9c^`zn45W}-KCvzi8x;&5zEd|TU9XZ@~{Z}mc zM848b+4ys^l}W$J)6*OD9C>ToU|k?dNt!O`+RWT3)fRJ+QA^MN-_wLI!RBS|1)WLC zmg4mhW$?hLcbSxNyw###k)b_}?-}1IWc0_%=HD7@&|c6iT@jy|p}qc^rJ%d?xfRU* zf7ky>i^_PCBpoFurhTAi#7Pxr`uPj`i`;{H?q%0r5BJOhw#@1XHSooOI#u2e9i1_) zt`E)7l8j|3pl2mRpVnBpot0w38RMo2ELO`%J>tew*tT3q$6QX6+D@NMxY1_b<~Wc! zH`d?&(8klb@tM0j%h~w-*)<e01Jcc9JCb0L}5{bk+v#9h&*gT#`2+Mcc^IZ_kF7enw#Aty;ZZv^R4f zSP|z5Ioa!AwhKAsrt%@>Ht6P$t=+Zu!-}KjZZKx*i>U#5xLs>1mUR3um1{;@ha+<; zFrPC?^NP++a>%XDiN=^dcqq0*n*u&-r~IQ8C-aBL ztK}3-M1G+D*;vw(6`iX6&z*tat0b|OUg5l5!yuOeSse7ptG(au#X2n|xy|heJ?r0L z`JJ3{$bcu1ShD)T5)38%7*uB#?S<%XfAxl`{vWD7*n)jZ>u=_+QDoG+Wz))y z_j1QOHEnaN(p*RkbW~Rm5b`y?)n~L>JusR;~qah zeLY~=g;lp9lWe*hweqYimLwapyN)kkok>v}$KPDNe|5m_8aPtyuB#Qh>*7+}Q|zwS z-+WAf{I#EhWn+VA)ZBoc|Mi@_T;u3!#?TwbxCf=N>n5iGTXN|jRZ@eL%J3z6FJ*eA zm?`56RQ|QWjJ;_I^1t{T+HGE)q2}KaHs%)WZW34*5wL&i*ND}{QY2*j)p{K_Dm#L; zO5yN&g9&@9isJV1#X7<_raTY~YOF4(9Y*79oZ$RC>OQP59G3s2V_rTWSF^tktVM>X2&k;W zd(F4G_t{@3InqGe4H8df|T>(+;!C5i%@%Vwe~ZM8&03_|GH+-XEnh>}3cU?i^& z`#?N5kw6I;nu6^|z?&%yDVb(a}#TXBHSFnx4Ku{Al)gVRsj2psP%a#e}p zKm*<{>(s`=Z+nr6gJsTRw?=OIF3V6j(zR7CHlTcN zbFn^1CJxdD=18u&L(Dr6pXmYB;;j@1ryRp85jbim|4=-n!p28XG1iIR_&p8D_L=)Ex|@- zs6K)`E?ULo!dinqm%<@s9@;OKdSL38pSs-en5uin+7$XtHjHOZe}Kp_vTy7v8NcGC z&t7i%c*QS{nu`4e8y|rGyWRh1(@Old{JBH6k$=Ly5|K%lTA@AIGV2f+WO>a@CO#)>h_)|F)5Q zv!isT4OiBFymtIr(&+rF3SKj<9DWg&2OTRyih^Do9I2wugCo^4gtz{`EhkjNy`G0f z;@zMVigzH5HR$KWDjtGjJ#61oi!KG|9H!M30? zHQ5{eEu}|HP4dZ!vxL;GBZf^x>gu;*i)(K8|a*5ZfBTHL*Tx2H#_uyRnbqZ29CtjB=BN9Qzvqpt7gWAT zv6&xZC!YBIb+#{^vyib4{Gpc88%a(#jI#;0E6}afeEGyhFFV!*a_1ALp&p$5wOfPY zp~KmwxnJzEL? z4L7DxlDk8tgC0$tD81Pof@>OFVH%MKNwTzX7Wrl)^5r`(J&xy^?-^zu)Al$d)vEU4o4?B38890=NJ#9HmvIVg#6z zifA_g+6y4rp_!xX>DT_}x2S~syG*VP*-L9^7dY%w+pW&Q;y7UILWt-7``4WmQi zRuY$gxJfO)z58JxPN8Pk{tQGU5VKmQ`mpsyW$l z=eYe=>?^n)^%6-yxN8M9!j;E_r%Kn=ZxS<{M1dF{w6~@7G%waE^apwCN>7=mskNxR ztXE?HekrQ0C8`MdPvJz&W!8EXnbA{^e&EUhzc69{Y_j{%&f@;a_N4I3>V8(Wqor8A z_U?JICn+#b?&^*F=g=F7{UfSuTOVcH2rFq~-rY2rzD;o+=g!_u=M$7(Q)^UtJ_-0P z;BP<RTY#qgDdK&GlN#t0DPfkS|c0iv*7Gv9`ETiqvz$KfU;}gVDIf~|5 zoPwA(ck#;u*(~W-&}0j%ZY%u-j=*_ITb=bb@ko1)VpW0`SGIpm4*V4(lip^tKyy!! z=K9&&hERoK=WL>@-T-|Y4%$|DGk4b8tTlK|NaA7L@5+68^*OQZyj?V{h867~S*qn^ zVK}IGJ!R>pBPORX^BHfq$k}>lW(uyrDC7trgr?W(}^pf}XZqi+K9bsDQOgXj6A}NdBUKCqKzxa-;!aur)sO~boZ*$wIwp7Iu&~noPl&%@;TyE0nffhV$5SNcOLZE>=>z$j(I@t2+%G_LOU|57IhY`P%Mfm4>U;hU2KHO&X zhKxue#Y)+r)6OvKUn2U~mT@b#V=!W$5G%D&AR9D2b-dIV-KANdL6mZ@d|kJYKpUwu%();ydon`N#-B=_#Sfu45c*sZk}cjf*+S2{Pt&Yn66$cozeW zbVV1ld4-mdLZK}c6|z+80A<}v$Ev&+82@j!T0v74x?6BcD%NW#+RFg`h_6z1$Paop

GCku$|mP^+DD->SC?Q%f-{$>q;Em80_#tR(pTqvip*3yR1={?Ka4b z*Cw8gRq`8njDL{huAakdcMWpF2^>AV=d2hNpHM009Y~CXn&T3Wc-WmLJD?P#?*aV%!($^4gQ?pM3 zZ+z4L#wGz#&7u`=&SdIgF@HgQGf923KW_zb24USA>1Y*`AleZ%bCG#al=zFxqS)PO zl}fDMQ=&ukO}Y5p9NhQiR()sSW4}4+v5VMEPsz!kd@st^no4;Y?Udn892hj_tl_oJ z+r|Pf!!_A68gk~Gzxm8gzu&C+otop=+@tzF3%`N|I)b7ILTaJ)w?hl7YVH|eW?|zK zBGfBe8@R0v5f9cWG}G(s*mz9EOrt1syOp2&YC+`vL7(KAul(1py zk1-XUQ;s?eCQw$oYcWJ!R%61O-X$K3oU?+KdBMndESxZnjO-Qg;iLxi3J~<7Y`k?N zvRw#?!e0<6(cIy-iYJF3Nq0fVj_=Z_J(J}N=2qRDtmHmjgblC<`;;Spj2n@Cl5!>c zbEyKodH%X5-n>3j&31ynsHelDM&Jgr`BjU5+sb475e{An^1A4bQe_qDbTZduKdq8O-dO~Gp%yjH2NB{=@d*z#HJv{IIp`_1*)RF3hzsxN6q5aOr0RkwmnAItcsM@eMSHVPYIUn86L&tbn<#ToCrj(ZzlPpIL4J-=Eq( znvQM_ruYxkM>*Tx=}*o7kweK`@Tbt$+_AwO~}W>yqOIXjeN7 zn+vwXf@O^8O2qpkIa@4aw^6RAzxL~}yh-x=-U#vlQkL}kO!C5s8u>>eBFkVA|Ea)i z4D&Bs^)x*ppSn8W)?#{YRi*=;rE&0E$g`0#vb}ixTe_>IXTa@xG|KEaEL?aa*RZ05 zy;Na*=PYAddA_1zzcd*9zxC<>hhQwfHGmVfNtiWp)YlIrxxKyEZyWopLgp(^eS@;A zt7)XTQ_hLp!Plp|1+#A4tRBt9`G&9?x5w#v6m%JNmM7kPx(GU%DkE^?!v177{Px>{ zM*9Mm%Xx9A=j1YTxXrjMn{_)D_ZS>=0&Cj*p*jbh9a3D_0K;#FFp@rW0FTIpPFNj^ z$ID_k^V0gq)^8qo^E-b_{gVDZYI}D1G2?rGVvHYz1obT# z1ZG;;xt$o#FgZIGt6D{k%m2W)etY}XPYl1ga+_KVjhBg4=Cp5cZ!OJfpDfe{kcC3J zhWXYDpBf`BBsP9ZeXZukB-hIg^C$Y5+R8|&l-x3o~lRIs;N0b-opMGs72r_7)P%-5s`maJ3}1e?sCLQ z^?JjPdx_#3pr4y3la|icaw&+SPi}}nbOdWmx)6$-PVI%z(>ChI)3Aqlhu)iSxMPSx z5R0MJCEw9s3JQJ){UxQrkg)&msPWq1lY{%8Z2v7=*#@txam<$JDb$C`3}UnfzB$Uj zF!i@dBBr*5)H-t1^EoWex6(*Ysx=nOVT*-LSbr~w@+nc%mWiF!h!f4! zg`#IPyM$7v=AVX-{A@x;k~2B$Lvt{Si&lNzJlK^n&SgAroeNo{cA6|+c*uSX7|V{k zpT)g}3x5Z0Fa~?n#!{4>TU(I6TmPuVQ{;)_@>=?#eDrPx|Ai%G9N{`#%K zyTADc`kpq{Uyuk6lY~sf$k&woz)&2w->#z=9yiYnptJkykgXNlHFampsN*=_k^jPj z$b)`4iR!VnhU)AYF%_IQFAF*7ou1AMuom|Ym9C|6YRL;1_LueiUlECevYxB)Y#qp) z+^5Xk530T-EDIHvM9rgRuLg3nFbXc>fCZI5v5R{Y>%OTN$eJhZ;)EkBn|XLwE^5`4 zoaIw7q?&t3`b2*+(jUMJl^px5lN7bFv_^fh@cfw?C6m|zpPe#~3Z{p5-2J3O?3b*Q za?%~7G0EHY&~@&uC%g!QRC^V|zED&2=U4-<7VmzW-Zd2?UmTn6(OegNx3GRABYj6Z zZz`JXwclT3kK8F|h+0nN=%q7XsUfQk>@p{p&OFx|Y~5HZq^iNdT6F1^UQ(=OL)Ev; zqp0L;CDS>ISKDUJ7+XseLqXgO=rCEnU~8$bpsiQx8DnJ{8=pmeYfO5C#m*fK^bGYI zYvu3sTnDUucYA15H0Ku@!Y`{MW{VGwSV5v&0P5sDUf_($yCx@1Nq1P$C*)(SF5yPx zoV+!A!MQVa@W|nL-@1!8gX8H5C2X04J@#y>CHJF3hQp{D-uQOl!NN5SO6E3sNR<)H zf8>b{sr&(cy;;>HmJT&O@FENQ@wI6?sSNrKwFNq1xvN*Lt1cl}*IIZ5rbm|DY2_SG zx{K_Lz76Hytv3^va^ttgqzBknJPy6PuWw+X+2RRmV}xbNZ5Bg_M^-za7qzhv%O=EWXDk#Kn3 zycII{q+q`eLp-5olx+(0gw+TfPvan<+nN_WmUqV@o`>BJKr6zG;aLw6y%_i%WZ1B- zXn$?=+&GkN9JwV%$p%-)DK0>79#Rss9IA#DeTx2{!3|^7i-Z{z*A*M>RuP=C8JYwIWDi{a5C~!hZKt$`d7>4&_TKl)QLGIM%?ss}!brqjMMFP% zpeu6eU}Mtd=slgrG1^Gv&Et+XTAr1o!S%!o(HtUONUq7vlzysXh6~7o0LLfG&t|4K zI4}N(KLRUUs>ViNho+F+6^UGlXdFGz7kxMVQ*-KJq2!FCFGS9P6&$%@f7EIU_rnH_ zT(OEFOKV=OydJu&fY2|9D!36_kaVJUGWiiG9%a@+X@E8zariMTW@wq8=qRKu#dbsS z8)Zik&!Ncgcdv`ja%g3cOzYN$p5@_pbdJZ~(yV;2Ap!f0A;QbwUK>mI4cHffbj;nY zRhoJ85N!y=-OmOf<~YI7`iz%H@=SCQ>fNxeT&X}8 zFMGWc9k$JESB&&l>wOX<4B0A5S32+Wx1>&&tq;U-O(%wL*6&F-j32}-fSj}HY3#Os z4ZkmArM(Glu_bb<51_E}HpuVd12MAr2;ONznbLq$F=;;r(qhPg5|T^GNG|Eq+Z>Qf z{0kS_=;^)KA-Y%N5P3)fz*&je%xYsWm+~Vg;(ujbB3;MR*HR@acg=ndHS#Z<{t&p2 zQX)N%h@)GE#tbOcZTR^wn@$fLo zp@(-J=n@YbC_>{}=^kSto1u(1eD4&^yP4^VQAgc*o={YbTL?)-y(0R8SH@a_u43M} zkhNY!46`_W-#)I%t4E(lo(kcbTJ?+eNJCD*x;J<_t_?b+YZ^bhyBF=}M(sE5{ z;?_MFnf0v<@KbMgGJ8bdcb%7jF@mvKxvxz0{k;>^?MRK9}>D|CGI8sABG-sdOG)n2)wn;|zL<~nWWmuyIyK`$e8)k;+OX&HB zEP5s)*94i4z9QitvUftvnqySj(tVr_EfIY~dk|OBs=r<%!E(*n&=S!XMb}cMcX&7( zS|a-5dj2MhY2v(^o4H30$)Xn#Im+Bx->Ex(5HssyYlwlz7*-zVFmp^lG{Y8-#%}co z{VfZ#f-~$|iZ7Z!_yaSHJEi^p471%1&V}iTQG4`|(K?m>Y^DDESL-)wf9|QF{%pOc zKbPW~)YXcJ@KGLz80QI}m%u-|lVZ_>wyvp7h{a&lOmU*!&(uoG^@9*85d(}QSr|k% zFfOMdfzS3QJ~iJ3uT}un zr08IDMm)&hqREo2g$Xo!KYKwQkwr(Tn-aJY+E})k-Ub&6gN{0q&_=TEy=Ky4O@f-t ze#XpOiI%WfQz+**S(6~$g~C>BFcxY<_q}7>)D?=dB8=Mv#!?5$I`sX&-=m$thfI2O zQ@?h+FftV0^_Wr2(bXs?BK!zSUYIz6jupNf3J-eWowEVp&&rwIYK)yZ&A+f!Oq%*`Ns(MQy(dg-Vhjk=bE&lYx8T$Qw zr+Qx6xB>dg_gleSHR(II+) zWI5>m`odK8>i?^Zpgh<(Nr{ESS4bW#0BRMLL8G0Oy1g^#*&wugZ7RNMz@6FJRLlIC zgLn6KYK)OxscxM%H3?Q}L>%nsm_qN-4mXfxlDbk~2q1xt5~a60HT~n;F!qPWw_pB3 zUtYU?mcHZ=7S%kt$e0`zV|>6KV@xWGF(wX=HI5l;FpjnujHagy#*uRk#^gl?+&AF9 z!I-$wU>vhE3ej(bt$^sado$GMy&a$f#(v4PAREyW_ z2Xh$Co6YzanjbQ*aZP=dX^B892KWZv_!__AX#bV|*33q0HlsCnYUdPk2m{SOeRwQg zTUp|JTd?^;K*hwru$;IitU~rh_1czC3XV58OO%i0vpilqW`pyc)0yiR+JjwK~(#{x6t--(I%zm=ce&{?6wVi?$oVSpq^fJr>CQO+dZEwGuv~N z+`!3>DemwsjJqW4{`2BEXO%^2`iIU}s&C^cj#2bo>1>mPP{ariVJb>}`&-+5Y*?E- zc_@QE(D?rT`q`Vg@I9;##rh>X^z4Za%HAH}do%2`473Kh$}!%z?%UIp*WWna!2c*P zy0wp38@GNUiwTTF@SW~FMg9OuF4v#gZx9kWX&I2~gqCm#wWj<4MDA)|25rzEL9{XR zPX`@GbzCW?_gzBzh6)cN-P#{on@}hJu|e;1gnY;0&UwVnz0UwZ6&Y6s-BP@Vh?jNO zm1n1|T6A2lDjaa`D{#^QFF3Ch{i4WWg|*3Z#r2Bk<&x(-FBd=Q@x2@Nb=wp}xyVp{ zn6EJG@ZXqaP5#vDb3YUfVOwZEb`tj7-$KqGR%dN(GWlRt3^dsF-h-wbHrDoDhy`-T zq71a9lej1{t%rp|rj27fgUk#op0VEzB17+cpHP!J5C?l(Wwf+7lyC2-S+j$wY7Wpr|y@K?&Zf5u3Ze{!4SkV0~OhqO2!*K#I1C^`)fooytYz634*HhAWukk;hX#I!?yAS`HRx99W_sxQ-QRrvJn8qw zmBN@?e+{SHjt^*MZY*&eQqT$&s#E(~wUe*oM1HE2kjBzjPNhhu4+5xm`Kx}>{1+<4 zg*YC8`F?zJ{{IAQ5BJ}p@c9e>muy4Dq5NdkGbH7ItKmk3hWWzzZ9y&URHD2=Y0!1dh0}3(NP!FWP7kC*XE7*s~bJ{Gl$x1iT`VI&AjLW6jI-&pE(eN zmxA5o6zh>{Il{YppxwO?3sgmJ#KDNZJ(Nj@yq_LJXrtljAlJt^9jg|cLy83_=Z*!3 z`kme&j;&g7=*oF%Odh1t(%Gr`$X=|>hCY+dh#08v)^gcY{x$m`hAr!34Ep&zrx6N~}PYupGc2GwGt zSFHsPi4AK?&%Y_#D)4>K{YjwvBIv%Dt$d$2Lb&bD_diCKd;Y?yhz47=@Re6SQtgpV z80&p|0>{Ho*7UEkG>tlDMLT#w9ktC^Z~px0Ih@M#;(LqkU3d9D(@I|yUqrN3Vs9Yg zHvOnObPF>pFvjgu;x0==!kH0>=^BMBVTMaT%0JnMb`e&|d@$o0U?mIkH`=D=~KFkukaxD;;_!bDz91owRMRN@<7YLkMRH6pFhL*z6rd) z@6P)Zf=~T<5AOE>b3B5wJ}Gz8y~36HQgCkK{3VBbMf2F8R7&STy)SUj@SpDWUni^N z)H`$fC7RPHxqnX66|OPc;7`o>2}u|n)kBdnwv_{8DQvl@DW~gG1CqzKa>jf-up_8Z+8tbx{;$P^Oul{#r!P337??MaA`$ri1g1MSZA*ZzO|hjY+v z;Wg~Pv%FdJPlv%VfeY}lT@@bB?1&8Ga=pe~B>oHf4Oy}BQwKlc(F?}H%TtY;_D%~& z{=0OoQ!6(;0e<%&vq|^=arXXkQPuhW`1{P6GlxM@a6q)wfKgPoOhrZAB+!{Tg65*@ z&$1GaKW=TM?$ylQ^#-2#;ed!VAX-@_fChFYmmVhu5riNY>Ei)Art!=>;L@f35 ze4R5RxZBoJd7tRP1`Fc()PhV5VGYGs<7dvzGsL-Lg+!v1fkrO77H8Ua3p{?18a(9SJ(gM{e2)$%9k4dTNcA0Pxgg8DSuJFUpDIZ^ESxz#Pb^b`@^b& za--bm=3Y%|>>rRC=M~63guRM1IMVDihE8#mIodQFNNwHVS{5U6o%LP&a4^Vi%fXSXVB+)N68l z9NM%Y)0&-Lbnt|eqIc5{w!U@I+rifjmH!uCAFvl(waUYeF5co5M~b99 zKts8x`$~5Pl^IX!>bOa|6WmkTlQ|3N5y|H=_s>~&wMzN3z#XnTeVDJED=7ZSf|q#D zs&@Xnia6ugJd-OuA@K!Nl$^Bnr1SLl6UUC7I6~E{FIB&C-XRV@JnGooFOYj;6kZJK z#|b%WCp{YO$-#5M95GF11MUW-WWQuEL5m)H#O>eefW0uLE}rlNp)2Z+BbtLpWP}2Z z&=ZXr`Cmj{g%M}Xvt68I`ePF6&VJ3>Cn-MSuUR3Uo4yd)<74hF^TkY;#|T~ew<0U( zLQj}hih5Z4XTskSnwq=pklZ^gy|cA%!?b`5*x?_X7c+?~0qy^7;Pb!K59JHIwe8pF zgE*J}qA&Bbe8FNR(;t7$Jndb&%SD%UVaVM6{%IaOPRQ;35dnVdPjGWTlv-Xs z7$G$%mw$d%YItqnPo{NY+=_#=OZS%GBiI_;rz?`Hti5fJekxu+m+1wD=Elo=ZARu>d zh_3%J=?7KE5%NaNcNCYX_!3hiYJ1xr4Zr_8gM23@+@XC*$|sPVLWRHTe7ye&U0=oA z^@jxaW%NidJFn|HKN<6s@o0w*b-%qyu$_PRqhxBE#LOYLd&oV-9_rI;uJ?E)FvcmL zT#^#jDd%41Zari4o9cmb*Y7gBat-%E`?=m#r4C0PM-VX=D)XYg7OZm)Ax99j?@k&2RAr)=2Q6!H zcT?AO26>&Kr@4#R&CvD5x6Ki6b5lz?jod@^=P}D~Ue-13-l|7tSd@9t2a&z=G8eSc^!8BWFK;v@yj~7q44@G ze&FG54Qxj{FTHFUa8KteIv5Li{_;)FPl)OxYseel!*1hoe1J&L!$z&oS))K3Yc3B# zUmTaaHN2}o$=83!<=HZA&^X`y4ptS=_zJ8!&ndRbMr#iCzrdQ?58OWB^l%rQlxrSg z@I)E7%50CJ_Fmq4^Fw=?`QekSp=X!6Z)^>Ji$AXTKLB3?(%LaaI{Ns|MjH8HhdeYN z`R&-L@l6}rj{yT9v@#bv*^#ZV9Grc$!5|zVZUDT}P7%qxKN@SBkXjqr@1+yADbQ2N zs&MaMw&jJ7_ec#c@f!6!Hn%}1UNc4aVJ{Z*vj(z;hl?9O_!u#b+{H=wzCV8lwBx?0 zm*BZM5?^=~T!n|!<^fkRt@MY;CiqFZn2H@-rc2`~o{e3&$~7jj_Fh!J8J;fl!;GKkH?k0KfEM@=F)(;Hs=II#NHvx(Y?#Dh{q`&BhN?-B$X7;u1A4^?lsAx6~5v7`gR1^~>7h64o{FhzeAB8h!T~j~m-H9y@_9XjO-)C!JPy(9xvgv3Ff1~`9&3%Lp5}msqV7p|taX1z z{Pc~}4Rda$ElNL~Zkx1!QvBqNlMPS(`0PURQr8~_%Ewkb|DwbE4v-A$UT<;yk4N9! z{e!&?UApWl`k%R}slcyB)Gs0P0NY$0EzotWs7Q#;Lq-~Qr|xnN9oH6mlfe8g|oTY+4)kULPkT9PNWF+wyW9}2~u64vp#)Cbpvgk5LMmwVLeO^R*b zAk%B2PVN?>i=8O1H}Jicu|pHfc&p*pG8Wy#4C~#aWWIP8q02jM_QG z1I=kq0|z0j0mUz}z~R!6kKBr0_hv=``AR<% zI(UHJHL55%qJ=x}0J^=pU!`1C{394Y=LJrw>5r_Mgw5aNK{l(an4nqo{8w_Ei3WEH zkfZ56IZwBYID=AM!gbAJLtZc4cPYMY*yzQ0Rj_+bu38t~FjcPmw_ zT*dnEJw@trPms0>-{g5*HTNjnO8yh_*m|mwN<%yK|JSRh|6?ZGkCQs^2Ab+hhMT$$ zV4kkOx|fjG+jhyZC@_L0CuFGv_EELXVJo~|wPqP=?|cP62P#Uca}-MUr(O1`-%zA4 zW(js7b(W-moTV6G>%WK@GC3?0ObE(G(xF&opIPRYJJTr- zA2=gv8!cMh(+&*7Oi)x)T}p2cX2le??e4A|`VQJhNDfQ+xMNm)@hecClx&EI)O+S7 zU@Hb@rOVTpl>|3tmyqRTeAr{-}mR+FsNgk>bldHkuQ_xyM13O=39R+BqXrT-rv<}zMTm)-{0M* z-jwafVe6QoVwE7G=Pqn0D^GPVm1MD=4VJKy_$w@1B9!_{=?B!lNN`?3o)=KH*+(NZ zPOp0BX9n`Q9v^PUwEO0MwkxEBLXoswMT6;mg8T+(gS4_Q1MIe%^4a~!EQ!?9#v z;5#=bxOi(6`!U5Rj4dK>ImP|b$dZqm-onG@04%>R6i8681OdtFID_nODA7I2Xm-rP zaaM-91A+Dm$?6WTO(8e~aO|kX2eYZSJP_O6Ot}T?u@ZlcnbE2vWyHM7mE4&{EB&lm z#lZuM6J_wcts)zA*2bEl_DbQaxzmt0n7!P+=_f({v7GC<;qC1jD$ot$0DJ=IDWSqj@WMJ0_KjdsaY^4vk z=L?I^<|iM%xYFDY-`|~MkJ%=N#0Az+mYuSWfij3V9l39tZmX0e-nq97v4W|K1!Pe^ zit4i#F2a^vt@R))n>fG8f$*w8_B3(*j;AUQD%)Kq-d`|&kL1~pDzzJXvasCNw~ptV zdhTGWSDM7OCs*ft#pZh+ciX+G`6mpCE8*LS4rep+J+6TjxE5_scZivPcs3uhyco*8 z#KvL-kPp3q)_m3~uP-}A@y&co9f^=z_Z&Hz2N5<6EIZ;^Jsdv9?>%@{@$0?@>(E>ZrpaZ!=n7$bUB9&ax{roM9Vjp!sp{}$9` zczt-)I|h@XnKwsPg6?l%luMP#Y`kND&5Tt*D?%Grwjg0`aAl2GS61cX*65cHKA7o1 z_%F0OJlNkXSXI?k(Ye1CS`{y`UAd`Nb0kIm-e9`Vb%%9F%>9s^S66L(lvyEHT8xBp z#80YZkFqptVway%n(FkB)w7wBPUoJomgn5YxoU%YpL%YpH8GUV*#-5!G`eqwwcOo~ za~8dNpL%YNHPJ}t^t^hXh31R zU3PeZOWt^-Oe}?T8Xor&qKqSKX0bq>slfZk^VUf4+7ozxT#?2dNt#yTrE?onO=5{a z2wPz)!WKVkQ5=x}gskL5afi<2n8gOW%ms~1F7`pk-e@+jX$05j{rd(bCS71hffm;} z2cYi*TsEeEfS!^&dS3BJM+S`oEV%?Vi>4`sNxSTnLnDWch$3DKe1?3%ro^XlG@J69 z)sb=(VkK*KJh|O57T)p=|2AAAn-I|aorbt5n;My#aiO>TkcEqPs=w+=Mnm4s8vcYF zJwiPP`(53IIvvbF57pEh1jmfduzt$d43u8p zr)hf>xA)*IUKkjlzcIr7y%H5C?nf9ABH+16=KeyQIbMi^K8k1}IjR+2&Zev$gMj5V zc$ec0q8qu_AhY!9FUb8)>Ezy*bu^bvL&GNr`xUIP8Jtz0S({bF1g0$g6ZN_Fpd58s z?K2`=(dSyP9FDeN+tAv|kb;ym;~?FC#~Zx=lzM+Vs@BAvi~q`SUc=7-dN9^d$*71L zLiLFOUq4svaaSj1+9>KJuupY|CoBFjNNI)GL8p(<&c<|0t>qk%a` zvDYoOx>prZq(4lf$dtOJJo2$LU$fyzgd*eyuMAy+EL!YkE$Y?HN?!###j)VkjF)+- zI{4fP&+J*uG&_lTU>ow>>cvd2jfPbu?0#EIU!Dimosx7Cok zi13T4z12NUvj<@ZqOZD8e#MA;(molrpx;R6j5UrF(P7R;0TU zjS0NxOmqsp-E<4mA;tr5J{NrR?m4}su~muUb)7OXk`*8}%Fd1QeP9~}41@RYZpqa= z@6*x2 zpIb&!AKc28T(r~}Y-#sYzQ!`Ln_ybu=-!ldV%Ap2{OLbt5b8?Y(^DLK=49GpGow9} z^*G@=QNU(}TD+lRdg<lY#qtyyaYt@?m9`3K z=6!z&zB_!Z;_p9ti(e5fOg;&OhEDZR!;=DgQ3n@G2?zc!KXHWmK6-~|=0s4wg>A{r zo@jdQ7T+Tz@!!s<+J~&i-(IuP!|8|~aabKW_v1HO!RJzz4p%T5)CTp>b7nC!omokJ zyA26~M_wLil%8u!se7EpN2#wK2`}Q4rdd`-qXdgxh54P95vCQbd=Ftxo=I$d67t}a z^3|()1=LiVPgk4R{Qp3-$w=Nho$XWvH@t7|9Xe{u6#X8Hn~rxKL`FaE?AQmanbChE z40ArQX~WjcT5spP80&p1(`YQ1!Dl$Vs7g696611ZWP;ta4i%1aS1?n~dq6Wkg?bsS zBR!!5MtO`gMtSs(QK&j4gu%vwm?2fNpZ7me*TWERhWHZg_a{+UWhd@))OiOYaGfyM z0@puwNU@dFg1LL)$Y3j3-p*~5?C;z{#lFtZU)Y-+z$4Rkz7y$MZs8k&?84LtV4-)1 zkJU;Qj+?ToR_;mBbX(rFkjWM?bk#DFhJbfISUg9VWk40}M)^j=?GcU2cDE6B>&;gU zJgD+9)G)CyT0_HqV~zzQfGMgBoVO9yBg)Z6Hk$TJi+8HMIo#%5At0}SGPY}W&^3w< zN$W-}0{`Na3wc}GGv$seI#>qKO2<5L*uOQboM)G9Rdba|dUyJ!oS$}1v+xif$hM7w zchhrPLW_6}#0S$8UICZnn*Pn&#c((lvccNX)CSUpO9a~A%d90fjuzn4d$3I-1w zZj$^?F^4$oB>7Dj{@Rn|jVtlDI!VqQ7*QrHNHQCyCzTm2NoH|G694%Kb%lN9^32BC z$Ewoy9p7Dz2bc#HCYclLN#;kFCz*%zPeLZqYxE5753J1Dqp^<;VtD@kvraz9KiI2e zUoFUWe@UzOw9Dj55Wv|(?q6R{*GqHvsn<`qOrmCiH#2idO3F*wXr2YK zr@4~3)+F(QipY~-pIeiOhzejmBo=3pwPD`xm08sz%R==d%w6;&RBqd^WyGCXW%y<8 z-ZH}66@UBcVI|W%7Qgh~6k9+J?ywo9T$o1h1&^e@jl?(erR{7=sLZv9Pq0! zM`3Cfj}Cab$g~Oa2jUHL)Nd_i+P9X-9)2z~Q&w3HjOj$fL$xb)~u_{EhghdnrnI0T8C2ImN z=>ym|w)LP#Ta z_*YKl$BBqUW>fQd+cs8(h_LanUbL_|>v?If8WA>Mq?V@U;~V;Qw3RhXk)}hUwm`a% zi4SDJ5pG0Q{?tnjTog)=ccX8kJ{;#V(3-KW|!E5WN~!3ANVBFTDBrcRIh>X%40NN*9yMiZINt@PwRcm zQo%jA65pbJ*}Q}V7k4zlnc&;*NDuU%y&|}WOB!Zo`r7T-b$o+6zN18J$|7VmjWV>H zJ$e?XfPdME%Ec}4cIlC4i#(I8;S-3536j~__;b6LW{ry&jtn|$p5Yj9aht#Wbhr)m z!(m;W30gP68fW9;gsqTZzscjJc>G?(jTfuLwEUy_ymb`rdzG6nTvD&&>E<6HiP1Rl z(jrDYH)5jPO9aZ!yX`?4t;p8!aQ$74UaWb;(aU%DpYoCiobo^^$Ft8wgRh`*^^71_ zMNHjGFQ4r*k$+F>hT1Q?IO{iF(uB!UrDc)Fo#d>1wTSpXHHx7pWg=_GSy8*NS56!5 zkTCYZ{FU`B21Hx}5mG??ksy7r*@By^^-{E_-&F}j`Q|6vRv|WBzT(ntspw1r^JWNc zpf;#?7FW9c)CT%=G044t1cpCx@EJeCR*@q-N}~;`x~JJG$h%6m3UfCOTIne4!5^Y( z4qqF^wj6@JWr*Sj&KaZ?heT0N=Kifiz^T6oL{<$Q`T}}%Z(tWh=c&0(l)GQa(ONfm zy8%>6`3~uQn;*D_SVCNT50S6~1;zg{^j}fe+t1@U(_#tNF47sqA!%n^>X}R8MVEXA zaw6_R^dmi>wi#<>)Y5DMj!O4S$9YT*KKurrC(YgZ@qup(B^?Gl#)PLb4J)P1cb9K*}LY0zXlY9wB@E zw}0OwTSD+%%~OFaIJ)u|Tec1PS1pH6p{F68=zghZ&QbsJ`Sif^`d@n9H|}3PZ&O?t zrEf&tKaPtNISc=MT!xPCj4sPr$%a9-vd*EFRQ!qR2^4WbwqnvX?|Y>6x@xll^*0ey z_ja0WysDR<@JFS^Z=4CI|c!W@Zj969X zi#Z9RAHsmjpTke$2<|=d61y(wGJB-y4HeYky#GsH@SNjLolm$8;P2 zb_z7=*X4qNJii0h0cYA|#L><2a*u%yp`CYEt;|Dr57#(+fj;xr$KKK!9&$LX%s9d^ zg~i6)>xvCHdB#>7{ZdgYV3&Z8b3;JN&(LJ=B}2o9c-1T7hHtzyZnP^@XybNFt0_j2 zDY1G*jAZiHqG3~-0y)fRLp2PY=cb>H%a!$hCjZA(eJmpOuIfQasCtAr%A!WS62Fbh zLnPuTChObun*3u(M0UQql9tAIwv}Z4F(6@gcpQdi^yf-Wo!52^jc0pK#)Ee_`A^q= zd(^OhH0? zs&o>XuJ(nvPr`F&{IDGDKuuw~bF)I;%`vbpkFB6D{xp}y)pjx1x9~2GPiZIAa_tk` zO)F_NE>p91f!-KXg^c`*%Dk*j`X` zD&_fC5t(exYfPs8$UUpkll+_J_4XL8H_j*X4iah#o_vI!^c(L#iTKyDJb$v>ubL_7 z0et3dgwLw=pcUWd47B01jC%lCHo*)UCOBKwqi`JEP>+_zV9)%1 z2V%Vkut4PT@#LbA)HPX2GrEp93D$?nW=kCILI26TFvKXnfv?6l24W3{&RfE%USN2? zYQ)x32^9?3kbrzwQoqN_{Xo2rxL)FneX!w1ArdwwytUpV&Ra&_e?0N7S_9!0`JS69 zxM9mf`r6Kt2Ddaj^SF15+uZ#lb_EDsnhn_j?;7IX3tDx$W9Dw9Y)D1+#5=QA&t5%? z1NzFNA)Hl*9J?EnbVnWyiM6e;k}osv80xV0(ReWRgm^i3ADivLZ`{yJ`$k`d zfs8tru*`xItAM_A)OP#^h^pe8ImXql201XE9^$umcm+e&%(R(Ab$UYW3&{}04g1%bkMsskOI zOC6F!-h{+i@Sf!gev`HJUSKc#&(%?$m95>W_lTneo?R{~-L!t1eHxs14CaT@6SVaCU&!*5SlkU5oU?s<_VdC3FpZ}H5S$#jPuhVrZ1 zb-E+EV|UyhcjW|=yV3$5Y)io-0}ei^Ruz@gtI^hJHtX!JIgv!b`2S9`KI4CAQZz47$Q#yda>)se59 z?&xVSy=u^-g`c2LuWa*Ysxc!nMQKsds-L2L{VViC|5XH-jU2KjrCilQ*zTU_ZU%U-@ zMIY)E4;Oo2Yq8qWi_9Tu(dG?}OryjL>AZB2A=UxUmy2#@wu1+X7N83pE+)L9phjsj z*nw0apt_{Lo3}_9517s(U}79tQ@otTBWvrdwP|UkxwDM*#?vHYc|>8X$0_JI>!wtB z?iEz3Hy-BShdlm1B=#5sP+5C&1wyIVP_X~*|Gk2jCIqO{(m|bUK<5>F3V70#qZ3%c z;P$kFzrhNg8d$;4Z&6opPgpQ$|F;NMA+Uny#r&%kTo72nQ}3_fd9c*XVTeAOIgq(? zO8I<_!iyt*;IFF!+65%pFKgy*&~hdAubqL%~Z+uTsq=*u#Vx)JxuF(YL`rJ zpocL_mm&K04#iVa4-K}D4-U)y$kx!S{`RL@>s?!PPkA#%piQV#u)@sIF~ehg=cq!Nb|z+7 zZC<=%bEU~a@g$lBVR-sh)s{gztKmFw29IS++(ffM7;PTZI@+8dj48G1PQ!0%_(+#r z@o0GGod^5Q$)??z3y7+Tmeub8CmeDtuyz)WIr^hjiPw+uxUAxO;O%aj(D3Hf+x$Sw zm~#^vqS|hoME%%osdS=jZ`A>9X$+9O2kFOzPmr%}XL8R|OkQr_#yfX8&4a4Zmy@I6 z^+ilitk|$A`pyU5&T{F7QGpcz{IkG59n-v=E7A7Qa&aFc`z&AMB08|rKKc>!6pln? zP)9iNj~pRS+FF=gv9;*HTGZqkyUEJGZy8&L-S*KCpx$DCy*L9qg`s7%5^os;9day> z@8WSM)zy+W-b7#hY`AN`%RJ~Z`r0zOWAD}apn2&QRT)kPJ#`80Avt^2jj|uGH`N{g zUHO<2#$ADCTzC9w%8R3%I#cdLt)_LqYDIK4ESp^emQP=1(7FhjagitIp;k}suUe5& z8Da`Gj^!qmPFDP(D!yiU{bCOJ7ydZscIPG4N_6il1-zY*0X;KYQ_G$8IzB!}f5}1d zLI*Yi?L(KiZwEYDhxKDOjw(tnDj#)~?bnHj)b5<8%^@Xxv z%u0vnj^qu8MExx<1|B2wooUuq=bPDI@D*Jc^`;%aeqx#y*zx2P*9iy3zoa{KbD$TZ z_V21?=BP?UAi&cK%}iJ2Svd+4`%2~%%VDk1A}f%Mpi1SuAO6i-gMh4V=CLb5iz917 zd1Ex!Q$!w63O&({_NnBv`BW+72517Ya6ZM~io36{gwH8Pf^6@Ke<9AyVCK-{up}dH z!oLEse(<0gm~OoK+kqV8W!CwsmRN+EaEgB))3S|gSdL@tkxQ@!C!?lyhJH^5jfW!5 zWW%J7a-q$!J&q+yV`r^emR=Wkk~kAtwkS#UHHi2z&lks=ChJy{VU1i-MK|;Daotq6)`kjG`~`?#B-2G_;!P zSE7~W$XlQ<%FA`4B|$1j4M`rgEwwMiJZIfR-fgyxWOK4)f8^zWNKP`!g^zc+HHiT^ z1kpz6!`#H*A>KZ)>s#ULPA}SY$Q<%Qw8rO3K36cpu=R$}&QB5m@;Ja*giqAb_rW9K zw}XbOK{IF9^ZsoNG=#r<*?dH&D87@BaFS9Jlf1Y-W4+?L%pBRCVgn**{rHX+)mKsO zTA8{T^~c*dhjKQrps{E%_VP<|tCtlm#G5Wr4^WGS5Yf65(r@ZMAPVvFBVy!iSR&#N zTP9G|ji)PuHB$(4kMdpjM#6s^nkNS}yLyc=gAZgVIqg-Sd!xBTsi?)HddkTJM#&Lt{9|S1$l!|JszP*kAlN zAt~xivz9ZydN~u)!`2#LAL0j2;z=Uor6exBNbV-_$_{6@#D|{dOzF4p!H18zHRz`l zCjQ|z@;lR_Q4f>nXX-)wiZ6-tI7YCAMF0QY_aJ80Xwat@ZaSpQ&@*L+0cbsIipLyW zvh?B*+Bd19(-3=tdygGnOGAnd-ktN>*HmmzhlMPgx*sQ zSU5h??+_!zh9du6M0gvrbciHuj!6wliL|E@$H}%L!$2LKiqeY*=PXO`IZtmrx&6f9 zI?9kfeOSwpzFPHN#VhB5clFe8>)bgJHS`tG=v~mWYmzusKPoAK9(Sj5ReSKk5%!TFDcamLudp$ybV59_SERU?k zifsgTBh6DtkwI}Ht==lbseHw@fW6}MINtl@65&X|@#8ZgsiH> zt3b*)RxaL7NgQ>XC5qptMC3m$?o`g^qnbgLU~GtR-wDcI@+WosJ|h0gSJOyl8b zHM_-@;(4TLm;8y&DmBrq;jkls-v4(dvYvoJ(A@poI zb4ub9KeI$*ZAzlio%*zKr&7MSouP^xyn=LJpF`$2k=x?cDmn~ql{a;To@!*}vx>1B ze)=Wxe@#0Ptnn_$+Y+!6W@@t?6CV4C`c06mlW1HmWMiN+WoyM2Qd+Y*Q{jNFYm|e^qcYt9}>$Ut2c&pXOZhYD?4nW9Z*8}6A zjS-E5sc-}^wrDJZV~||fCuMfZ+5B(r1>3IpZAiuBiq+mZ%g+0D<#JY9&xaAQq#+*g z>G6ogk7wIYoIZT1T3gqFienk5;_bfA6Vw^Znn(V5(;xo8Owat0G0gyUCS5$jB5+n{H}>F{S40!t$~_+#Zt(s^z?TdyQKeSom@Cm zEMKsh$&2vst^T6i?iRgW34`az{dJdiMcauDQ-ZV66q7ZMR$MsNJNV6qbo|eGj)yYx zi*K^ZmE~;%xo_5`5=x+%%Co}9zi z%5+66!S~sl^qn(Yi6PF+yHg&w=cT%i0-V|v&9kE<99oXq{jIma^ z295O5e8q~97U(ZV8X1!}R#M*8f#O7OBfAqdq`2IXlv?ifVs#Hp?VC^izzWYMesMMr z{KC*Blqjp*_(ZC57&@-Ie`E+b4>+wyGGgbPXDY>pYjf#xF%RZh~u8(uGX&ha#2 zgPNLuvxT!hwr@VMDzQsob><`$ecKmn7JMXlOuYif9$e5j~{YhiLVex3x3#+LoR{yHKbYk1=s| zGslRq83@MsqBX@eR#>#)2_w7H_G0P<)sv%$D*m*{wilhSge}arWeVs)^W(b{3t<CafA!H9a>mQ3bh1C?%gH1~x{~1vyQm`U~4=rm^L`~rtuhY8LWQy*<+z7v4 zAA)3js=-E{>bI*j`|f7dI`n(%SSRee8qbO%%WW6cato~*b{n$ahIiO+Gb(?#+B-Jb zlkmE!)RSjb+YdOvvs-|$)NTB#W#Ie^gL^*3ergc{K~0Kc44T3>EXPQne0x&fmztdF zTpWC&DZK9Y!MZ&rL4PtJa{zx<`$en0X*c&9itQk}L4~<%o*aEBWME6uGu_6M?Bd1W zJ`?kRQ!?qrj&?I%Ch3H-v?a6=Jl42}K6H!Ul| z6h`tCzp7y?R$rqY6OGb6bUttgdO~OEOfUwJXqHEnK_OG8D7c#!_3Dm?oX^%RZumO& zmES71{#Y{$5Rny$eP%lJn>g|K`ezYE1x^XMYP_LJoU#5aBrXf?v$IQv`RaAS22}6A zlpZXv_kwqoe*OQq9nQA!e)ZL$_oMO)`o>y6xJ>e6Un;<1K_*|au3G1l_4N-#o!31R zSX0m4UsK_`kpYM*U&%F6L_;kkdM%%I6)*;oEequ2rVB#_!cA7=TmDa)svNA@-$?VJ zH!D(jvTj4LZUQv-uOX3e9l2T8{mM3}+nrgpM|i(JdFmIz%y+70lwhatF$qT06{2i( zI?^b|A*o;0yCsBL_Ia$ zqHj^o2V=sQbKX-Uuwr$~}bO+*5&js-b<{w#f_!Xbw{MdD$ z<)r>j;~?|;J0??1ZT3@~Wx&MM56gf0z#t$$W~}JwDqA=4<>D$X(L0d4RCu6p;i7C? zGFnV_3;F>6i5W1lA$q|bxiC!irW2y4?X`|k$QVXC*c3-FqvMUIby85(WVlePR^~N+uFQyK z^50t7XO1eNGCS4VTl&n=@KfX6&DNUx>sGU#PB~^cO_kq*qxT&Al04Q#Q%UJ_ywBK* zsxPg*)vSK3hFNl!*#FFIhgI>}bqe%M$ZsvqkKwU03wYp;2_=#vR8 z1e#0CZN^PRy&-sQLOHUHy1yi}jt;J_9TQiN4RwT0H8%A8!yVP$KB#3h$#kTbrP}D| z&J43b4?D7cj0xTebC!{j_7b4|(p1}>88|;7@Vn$3zLl>j=9?}wyF@`3EsAm zhjs=13b_uCmQ=7@)zcZoB#uc-izLg$&QunQL5u~O6uy}{xt9u4_B@5+&; z4Fyx64I%RGm#)Xr^~v#$j(Lq$tvru>to5JzEc3#UpnNcA*@+|A0lIZqj~=ug0o8jD z+5He*84ZaMQjQ~?`%6H>o7o}#&3nFRTU+c^B6}UA1=#BnfN^M{$|C;Yqp5X)}F)r!pV zh=VkBVWm=HpLNV?Nz}V_y3=Muflha_%&?3%i&Oc;zIUK?|C~C1?N@836e>1II?^`i zfUt4f3RP+6==!P9^I(~@?PcG&s)X@|Q+acME^No0)j-E4iHGiSSmROe{`D<9+E8rU zkXJSx?G&;&!&XDu`lIW4w4qoLx9%D*R0&h_PUTUQJ4L*|=$dc1q~4>0f9~qqr`MwQ z8zO#HF1(3|e-G?0=5_ClK7n~~{o1^B@vli9BYPK*x5SbC*|r>S@!0L*RR;QHXF2*4 zg_p=u4SUxd{J$6WYWiEv%-iad=Oeezyd4of+qQA$wKJ^1QX6BoBkIJkYcxMFbd2m< z%*j1}fK0Dg@%t|W>w6dYR+8>Al9ycImMz8yTOxql?!KH9H=*a9iS@CS-~ zDWFV?@C%RbNeM<5sdc5*)~slaqNSVa>Rt=RN%PVG9+7jpHl2K}5uOIdVnb zy>!+s&N!IhQlx?WX4?=)0CoK8%@FU^u<fdmkd0k5{L|nP$=$m>%g@i>v z4DxS%aR%8-FAN@s%mMvF1&3CzE6dSG3hA+b32M@3CdpC7Opp+V7ehPR6lidS6U14I zP(O;=k>7&t$-&JP7HF-p0jZHs9i+ElL@o!HX^VVeUD16M3ex@_v=Ed4osmYs*GZeH&>?~edsTvc zk6YO$o`WB(F~L3TN}|J_QXnOcEP>^(ooxm;EEtC@ztB}HDJHM?`;ek4mOTNAyqR>5 z&Knn>%}0$D;M)?WUNq#MrWhUSp6yO1Jty690<~AP+V()u?umM6FdQa0ODQt1q9UGF z1I0l?Mn*<|YO3Ztn3uZM$stA*Q6NjJU&l($=#dnV30zuCBUW=s>73RJzKl4TgQx1W8i$i^ zBQi*5{!nD*jiR2ScIbTE5%8tk@rMnt#?b7T1PhC*&BTt)54LltbIJwgn+J}O4%zoz zjf`wVWQ{*z*^`#8P_~^;2}W*c4s-0;8IYVB67W^3>pO~L?SO%`Ri(Z7zf0?s~&WkSC62kAd+03zbHfY)_! z09J<#z#!5e`O*{YKTqP{%V}9ttc|90n@`s>B`uO6<6TgyqXqL?Nhn*JB#>NBcTz1< zIWmEhU7Mk4=vgX|_sn`k5J>Qi3A=S>7Rx1Lq_GxwT50Mx{`~jyCGjgns;y}4z7KWN zcHqh8?&=vt4dToXjqD?d^r~R5K!-wdkrvg-O9I;mj3zD0LjLJy03pvXUr=)>mawIO zj*36L%RUy^E1Lfok_K{qBYv1~A?c2=WyYt0GsxN#Lgo!GKYak=)|x7^SCMDfZBroO z5r38+syCQi-g^{5k6q_4S3~ARj@PGV5$*@}ThgP4MUiyH!pG&&{@eU~74bq^QTzaV z3srzs=Zz#r&N< zV@Y_?@nS-*xhEnG#df_(pC)9dnYs=QDVl5wJ-l(`Q$U`6>*Gn~uFbr;znz1O6@hhI zxRW#Yp3|MEA^ZET7Jf#5WR`xr&&;+lhjEy`Ve_gx#3$Xr^$;14=x(5Tgvwq0A^6S^ z?Av}ZgKOmdvofYOD83|A{WBYmGhBP5-k_j9VHvVPi9rgX|oNPs%V#pB|(th;v}m zkR$8CF;aAtllp<0T}Wd{yv=f3%Q!~%8!UaiWMRsnYQ_(;Gnx%h*Ptks9+klsj!)2Y zO{^K%5&eN4g`9jNFdu|ArslEzubgjGpD9Il1KIw42~jrCQ?G0*;wd)wvdpyzjqf$4 zJBW8`JTqmt#xpy3qn4p3FGIEj-cD}@Wj;!Dxxv(VoHX91admBUx?+D9;o;ZDtkctv z(bK!T|Krm%hD2R7wv#PE>LrUlU#7L>;E9ftLa+t~O}y<1Y3|NXn8@TlCSK*%69s10 z_2LNm%iRCJnK}M*R;GKOnG?=1^P|_8dC)D)@9Wot(qb5RA2NJtPa#?Nc6=2$z7#3& zl3q|Iju7~X{RM5zZ9}v%Z(>9B>Q#)lN3R#;UWkRk6N)rKkd19B7mr5`KiVmt{DkCV zI;OW!R6;hSS#6vvHt$IpEcL3MZ&6bzt8l_*pYonFT%Nw4 z4RMZg2x5WwjhCObP^Z0VqU2A{q8}BYx67>|wTOnzX_Dt||?ZPgPcwO%3rr)fN-t^_B3HbkzvcpCddbi%} zu_mk6oK0Vt2MM|wHSdx7j*N4`5w6bKHdI$^{`U5;%D~>=jD0YI*DCQQpc3znYO2J$ zy`_hOy1xgC-HmDm!RBuRwR5EezFy)5(Ts|A9kWKWJNI-(&52g~n=#1LO0+NNL}7;cEwW zk@=Q*$WCfc2UbUHX)-^$7w^^gFuyP8kbOvF8>5XazIe!9`dU;~HgCP$Ly)p9YIcCS zhkbiy#=&)8pY_UJ1U&DEAe-d0BSC+Y7PmJ9IM_vpf_15Zw5wL4HvY~rN$GEo$i8N# z8qG0ycYl5O!uL@PMt3eHaphv}+=PfjrJ}M+&&z8=!TqC|X|bpy%yBt9)S!J0I~H4s z-FWv$zk=-f4^^6JB(-|bidGpqt{wD(H$6H%0_X9C;NSmHt@+u5a*sd2@@9#M502r$ zS{jk~_8!_>OZ?Azn=;~J&&_`OH+}OO{%F1P_i~G77Yk_L+of~bJSW&^Tln{U-IN`^ zh`dUC4L7?Q?S6POT%Os?=Asg?$jz+@YT@JFnq7@v;%Y(TT z_OCS!KAX5l^Sws!KCGhnDxw94HLg0n!r)7A^V?AWwE2;%pjuX$y9H~on!f(SmT-5| zTnph@qwQ+qY`Qe9rRN*8HKR)-%0q;8c(DKS+-6-8-oX!)&Y_L?R?NCft-0NXk@a_z z*X>~E=J5U`4m%=Z)S5D?x>1!=>MgC_1I5|jckc7IdxKv~QFwFz4ow@}!|Hj}&+@)Q z^j&w4K{R-78p86bJcI!LNIfD?U0kdrSb<}M2=QWWbrfl4nhcy85nuJ8J-wp9n&3`! zR5Mys;&xqJPS{77FgwL$b3Sah1)7O>|lAY^atqb1Fm*%>X8ZCi_9?}183gB zI*$n1GZp`=OPb}*e=$eoA`TSC9m$%Yc^82!f;{Uz_9#^Y##%p)cRW7UE>CYm>?M1g zIR94Kzh`JUk}DG8(3jx5Q{F?qLFL?(BNL7V-VSS*ivQZ7Es|ZO0R9a2ICk$ps#)-Q z!CI7XQPpHj_S6@G*>fKK0@TUfiWuj>w?A&Ii9#%D;oTsXInBGaZ;`eMtd8)~>7cZq z`W{uJk*v2Q%WXQc1rbWQ|AuA>GL5WOM}(d;jl9fI%L_e1Ush{%h<=C>tTkTFdP9w0 zKy-OOtObl3w4;79&oiB}dWLoe@>ah)QCtMgT=~e|ETO_Iexzy(PXX~DxvHsRH!AWH zry_ehzul1Fupb8e$?aG5ye|pVFc9`SiW8N9YC(Tz!EbteeUf2h81Muy z%0)iiW}EyY{GGe5$yvxh(xQK^TLkVB8P^s4+j zzoA$7@M3^I>c$!-YjHPsY{H~&W$>($zI-gJa@Az$-Jmy?$ZIO@wRrygYs=AMwnJMEYV-X z9u`O54p^YMwm6KupJLX;p}fC-oM&Y;VyOl)#}|sYBGm0u4A#(cL?e4%l~{of@sWlZ zp#@cLF&4EIc-gHQSGOBNl70oVm4wf{zNM>9kQ85y|5*qmn3hy zme3L5EsH~k_{#FdClJwg9@Qz@jGyynJ!}Vr6Tu<#M6($XZE=v;U~}1>)t$3#R*x=p zBc$m(9K#~Hn{^8!O>?ke(w!H&a<(G%D5YyK*41!+hNT3)g3iTmG!+OyRI3;b_S%J!2TXH7BC zh(cR>lyzz80ZpV&3+i9D^k~W`2n*5_Xg&EG|CtF~qf+l;h`tHXn&KCqbXd=RL6)wx z_YpN6gIrusqu!&pFp?!A(uyXU)~4Mql}1B9oBD4Z`XOnA&o0|uMZKq) zC)zt)fykAww^kFP8DX0#yToK=a2m(|%E-aksG`_|+g`ZW0O>?bs)hWU1FYDgG~)%x zN&|oLOR*Fqwz*O9m#(Cvf)z5&m@Kb#nUw#8MlJ0PyI|cdB z&CZs7ic}qH65K<|=y*ph)-QR2wb&ImDk_kFT#Z1f5nvZzI0b85)yLgKaK1+W$j`GK zLLQ=cFe>$~CpFZ)TEtXSo7frfwD2j7tL}-WluOg#?*`X<_EUbAU3dH-P_(d4vF1bj zq?k>5U0HTxq+;6}YR;~YlTiI4=|#TWkWzR#ffU_Mvk(eDk7cOc$FulNRo zhwKfN->BEeHt_y2k+9SBsW)gImRLz%)TTpZDlbU!jzIO+)rboQrKlq}oTw3+eU8a7 zII<}wb#YV5_!rIncYp@>`HSVqw`6xrrv1osDun3R$ixHV8vdA)mZ9l|pHc<-Cp7D_E-mSb zfOv0uxAoW10ZOLMB}rY4vC`|m?gb1X8WURO4)oK|HMq*ZZ0R#mkT@%?bAE>uO8Lp= zt&O21(JBMQp`?kJW7>u`rFjx2e5Qb8lVAN*zP6)(TTWh}DE-RsqPMsFqt?`=YC`JNP2*8s%}*4Cf2rwnuH zjv4B_Ks&!R?r2j=LSU()QlRUH@E~>@1ueCQ8}PgswaB^ReUZ?TXmx;gZ<8d$d8s7+%;v!*%@l2Sb|;4 z285L^F}*HA55K|7yWDZk?T%0f&~{*n)>W8$AWm%FFj$zUvLa;lhYNCkBk--$P)WG* zkCZ#yp{HB1W24p`Z284QNhh559Cw{+HlU_)s{4DvdKP}hrg@pKt!U+}*HzmMEYClo z%DbuUt|GOMY`@p}>8z($o$3wwz$A<@2HKmG+1eX=7rk9OlQR3+c5t0}vH$+;DQdg) z_s<>&#sEAb!&vVxY7r9}%a8?pi)QjGxU>BynM@`@5ilUq>WTzkY(;z^wZE!hNe1vy+v|Jn zsvWKC-tDUQ)^)qL-h#;x15(6jSz4_qK33PZDz#Z{DWE{a7wD?gSA|AQZR-ZRD8-8Y zK4&Ha*uD4up-kp`=KKDh?|B~yd9>E#P2y6r%#k~Lnm6oZXyp{Css1_E<4BD_Kg>OE zS`{3`$+CyKkD+bU^O>I(k{;9?*@`c947A<2>9DIo4Ut6FF`o7$a>3l}zC&o1)Ky@t zQI$+;wVSv{vL>RQDzTOHmxxuE)soWjhSz7Z>c*6uJ=fMFDwN0oU z4>?D#_UE76Ip$~DpFdZ=+xdlks=Pas&`+GH1l-``$!C?~Tfcl-=_B=bpIzxAPEsoR zTS0wO`$>JImBo2~pQr)4;YV6<+rxh=xTz~1)T*mTWhIfJEq^JXYF zXWd5Xh0-?J4Y06hR(y}4%f)yIQ|YHDw@C~%)P$|_^E+wxJ&y6}jF1*2>pSx^y63y$ zgdz6v6Qq&WzCxD8{LIbgmELC#Vo9$$gzuq+*GSd)EDz0m>+_Hujb9_rvSP)qzogo+ zzgqR$vENqsr`J!lVGi9`ecA!Acua8VoWHy4^KW2;H=FRkbx{-DS+;$^L8oqyxBXT4 z+O+;Tqsi#}T~?|lW7ib1-(<~TyZ8%mM4sC5;BA82dTUY-7qgg4&@n@u9#@+?MBGrw z**tN^f>V@NJ(YPiu!oAD8djNgTI@-38u)gDM9PWSc4Bj|JJC#((2*2$V;oKomsYC5}jbPZpIm21zfWP zdt@eXjfJ6zTM`pz53?#Ux8ySwOW&4Xr}6r?8gHvKR@wVRVOih{J)Q}W z42PRxN%m5??78jGCvZzA6taR3vF>p062#x!GH_P>589G{F-QMt;X04A*k(B#lvG2s zWcKf}1a>GQZ>0S#NHqQp@)P16!}Q)hZI6yRp363^i)6$}C$!=Q@Y6hM;J$w*t&S z)GSslTR&C74urL(W#n^2vp(yXCLJ8_>D@)-BVzO19xuKQeQmz+d6jBb{C#MCO*-R? zuE$Pn!8qOhSJGOZuVR5$h-%&~YnO<2K3n4=-v9K; z6ST(JXW6|*=$9UsB0f4F$R(1;Cx|_{1po9F4PmdWbf?dj{>jkNaS0k^GsKSK7%_{F zChT+ll#6fFi$zA};y(IKxt<_z)RzR`MZR9hmVYGb_9fykwI*FoVBcrflO_8ODa{Z# z2e7%$K;(wIur6893<+-uD;#7Ao8wgW3BwMT&nx;^^)zca$Zml}f=RzYJH-HQ{Xp_E ze@l~YOB(p?@PU5iD}9vu)s2remix)CrCv(4rhl3~IAajj5B4+qBk)Mi&WUR2wWRs_skh;wH`*kpdo2 z>2Ucb%p-|N{{XMlIAF(?G{kNLr{rH)KPd4s^?>X-ve&46c)aaMIn}1Yt&j=75WW}i zpfazZtQ9<1zV(0WC-{{O8hCA2(cX?)TNqX8-%#1lzas3-RfoMr#zq?~W;-nh(%!(S zUM%AoJ3}+1#`d#D)9Nk2%?Zif?5bfU4qdd_)*4-+Yn=v*i#YSfo6%-_YqV{4YMl99 z{1tXihD9GR`zMo2-oXDzBnEdIS-3E#47t$M{SED9DKi*figRqd5jDAp9PKXweHv&PNhH|B7=9 z)Yk7c$Scej>yc?nkKGWi)KJ3Vd^OfRl1~mpC#N{EQjS=sYDHf@jregg4-6{ym`wm~ z&DKv-s6yoyQEwGx=Y*(t!-_w@Aci{_imoO5fAhu!Y3WhyXy5pxlaM=N*5FwViiW6M z_(~XYxFrA=iA>3}DH z_C8u?MIF|k*P&odmCCMgKn{+(;$$I7scpiy<6ZXH7jtxqJjfjK;Q5oA3UuCw?X7=K zmW-6)%>2>KM;-1@?TMiLXr?pjXPu05?90K)?5AJ`B{mF6TgjJzaInAeMIXuAAO7m3 zlccD%p6)y3uwRv;eke!nvw4QR0_o!iz_GxKN9u4pBUazIT7?T7X3VQ|aTd@LGEWyx zJYw`){hQ!zZ^W4i5`O{hX5)g}-Rbl5u&-U-a^nNK=?65a`w{Ck0cSJerFrzm{0{$n zH%{Wj#yWvcNOqQ;>5JPXPUnOi^?86(l);ybo_o@-GF~ z!7r^Fu9M(vZeO85K}N?#vxJqDcm9L|i%HiqowVw+q=Ae5$(1JXF0vHTg*|oc1u3_( z?%>i_)(2$8*;bw;NVLBtfv}9fUc~{B0Cmca;NKIF8?`5(jYQzJgmV)g&e;l&+OBh2 z?NwLd@~MKQCa&U@SJwLz!X_r&;wEKTp`F_AB+G*7iW zs{f_uU6DGC_cY%s%NMG7_A!%Y*ns!}m!^ zoEC8y3;r~)9QlS54o=!9Rh9=NNC{zyW$xf57Vfa3uaaf@x~nl&nUm#npRMnq;+2dF zocHpm?^T(cQl1^Glmp*1`pdw>7)cwj`8chj@imjKbveAG_4*aE)bFa9L2S~BmZfG! z2c2O$U-X3hKkGYnbdX^Ga}VT^YFn~&=q$A;0mRM@IA4 zFe??*XB}FppXFbe86Q?n`yqRCtOMU+P0hjrQ68JdT7FsDX?KoI#sJF?Qt>LWOpQFO`&-CruB{lQ!w-5nx{^_ zXX^1&l0RXGcC=$ZyThJQI7M(a_nka?wV)YxoZS;NLF64;c8EQ0G~b*o{_eXV+b-I5 z7ZcCjiJ@$MjUVq9XC-Pz!DjwwZp?bAXPAI<_M*4&`v+g!uO(+e<7H>IpK^O@HOM8K zBsQ+*Sk%y4usIe7i5GpqlNS^7JT}iKLt_wmT>0(v+k`>JBc8Pu!c2+ALK!n1+PyY{frJB^@tx9z$)G&xd;7JbeFX?uYK9x$qgsTH&S~ukHx{#;jEG&+PIV zCk#99gnDn$j4C%5yrHtKFOkgUNj^xaiDsGmE$~HNR(i&JWJgSxUuVJ<){hOYSWik*CCs(EZJ4@&tQUBc` zWa|G(2vGmsA!O?RNeG$x&*-H7m04c+G|~Oa{nWqQ^{%98$~LnXgKW@iN7QWgBnrXS zQmGpI#ixxgthAI`+*+2O3H|uJ zy+40Wz4Q`dQh94TD7YChO_|n&m|97#K9f{y(SwQ>bZZ#z!Ck@oK_R!%ds_r z5m=cKn`*SKY(<+x95rckaO#rlKAn5npE)oxr926KLoR*x7}EC;1bFc=cV(NLuHKV> z0W`bDf;t6@E2l4euA&>jcTcnN%q&X1iuVvR5R56m%S5C+JNsf#$s7kjk}rP4ikqG@f&Zit%1Terxk7nlKYIXtR#l;sgx~ zY9;10Nk|m?v3V7&uyi7qYRciSipw1E$FZ|H{H4Nc!gZhOm9fuBacVI8ktU9LaaPgV zLi6Cgz4qCScd`QZofKJ4k)|k-#wlkm`lKYs4`z4fgqe$HXkJ-w-k%c+ zy8tuPf}D2N6*-JKj~Ng* z?SVH{?bFCqe1YwvfiKPSAogPBq0y>RTFz zzdi&vwV$b+MNtA{B$6K(o%zKF8 ztyt#Ck!nf;z8N~o%*+LJ%8AwSu>G_(EYTJ$>4#Uvdyw<`%Y)g@PIN`X%4Lubq2;|SUfteY7%(H*k?7CU#y!@@t(sE%PMxJ zP6*)Mg<(Ve6(jc0FO3EGIkR8@-4o+hV%!NYgG=HkJhV_`zFFs$e6jQDe~mn7AK4G( z6nRT{F8<;4ERQ6V@U7ESi`|F6GC7S`4|-%8v;q1c*cL#q1}kWzX6q?-x2)BTyo9qX z^a{}WyZM1GK666RF~mLSEvC0I#OVOf3}9#4=}e;*vO3UACf^2gIP%a;rrJohv>A~Y z+Mq4e$(*T}&kwahQXp!$p|Z{2D(Kx2Q^2<8R6r6aLsmyJ^u|cI4O$a(+)k@)mr?^; z6TukufxBTFL4)s;y{k)lwx*t*FFLtcn+K8T`9>C&j%+@@7M;wtE{3i)^!Nqgi2Dw7GX{9N88^hY@cRoWsl^H;2lCxt2kR-+#4L%?a8Q!DKY-^mjC5YKF#d(TFe@pnAT6mf;X1-NRRO9I>1Fhyh zty*w&8f9#a1;jV(^&q3uZ%0uWL#TltllAk!)v*5!FF*mW1GEG`ysN0^U2OrV&5DF{)EXU2^h1n#b|3- z%$Oruwf(Rb-~kJVXvCNJ@cqf+J6vzFDt7sXF!QVY2U<|xfU=Cr}A&x%U!eyWR zT;_oo3Dz~Gi0>U;Cg=0=W^>md2hq_zvr{Mxm1PL4OM2?8Q$JJQEAJXtnGHH^Qz;_< z7`$uwf2@)%I^HlSrOX?ZWzdHOZT&kebM)BNIA`Aej+T-vK3ujrVNw!@xw~x9R9_{M zSc#e3(5RK?aqc-L`>P$-c3(O9<=IP@&R?nj>a55H#Q>|BT)7r_@h#Dc*?i2&94Qr% z^d#g~tXTe+xZGuOPZqICPZs_=a?l2`R^13zxEb+9g^M3!_yX7{b%Z%+B>U@YB|!y< z$nX+d(rX}V4q3#Sb(Ojj-CdoTYto4hqaKz!CYv>uU6Tu6EuBqh(v@)MbXo7i*Mz^T zgV*_=?>}W5QZ)uV)fhG{HSw~X7dJ0=4RT29=O}g&X1#{<*Vmn31>Fc>7euycgZ&qz zZaSw>)QFr&I(T5|()#){&mlun3M<pHD3|>zHR*>p8YIYp}G{=?`5C zyV6QsAg^)gq>Q3Qf9TgQjkTm_A=~eUMZiK;i8ess&YTFjtZ6=UZ>BamThy?OaMRpz z8q=G|wuV?|$U-`cXKZmfF%&C-HDIimt$EU<3llDZ4~<|mV%dGU5`4A%6(KpSkfn>6 zb7(e6lb@@JtI9a7Jvr;d%g26Qab+DvZp@yqj2Cy*QBiBuv1vCWXx1suC*`*c&YdJZ zcWKfESaWfsW=lfM9GAWUaiw8vf*SX&gJdnc=2f+hy2H|Gm1?6~jt$&xbo=0DxC$BK zFR(&7jyF3HK@>C>L68sU{pqjGxHQ8$_tUw9=e;{m|Ev3xjo4RN8Cj`KpTPrv%l&Vl ze=vIc-v35fg}I0Qp&Ng5yKLr-HIXynzfN}^>4p^j4{7vf9gEBP$nHD^>a=CzCI5j1 zpA(&`NmT67@Eoe`q0q$EnJPV1w^zQKhai3wcu&QiP3Yxv+7ob_;4Qr&N)=~bmW|Py zbe?V`wHy|ffpS-n@hUjet4c|UBj^{?q%O#55^|-F?5gKq%AWaO%ZwQ+ZH*p1`CZ@} z&%EeC!re&X48(9?l zAJ8$^`yJipMAL>F-Y(SE!FphQs}=M3^uvFHCJQzB!C8@YfVA|BB6G2E!nM@)_pc$J zX;yMc4oQKbFQT)tOYz2~-}H=_MZM@G_!}3(E5P5f;@7l0iK4*?n@u*YoZFJ=w3l_gY%^nHSd@Z7)53pn2;ZyJ;nwc8WJt94Y0sBR zZmm|XtuqE6;OSZA3A;;?tEa|D@JjZ{=jsn%zA)1BX8}4o6MRQyiBa~V!1=7W;iq10 z?$V}xOth%2CL)TgOP(BNlr>+U-Jg|VNrM9RY+yNqJ zlZpY5Dt&5y7!-~S?OEN618ved;+e?%jeQ@WG$Rm4tK-v?Ygmf7@aa7<-8Pj#IW!7Tt zxz!z!9q+K@aZGwT=nZY8r-NROBIqC*ZfMNOwA8p0?983h##RxR99IMBX$53@8w0#@ z#l-WZVNtXyq*K{i2OZuB(aD1YBpaBt&;Si{+ctZ#)(q_zxCi_X+HqQeR}zLLYsD<1;o+Pt57j1p_hens&GfaI8_AY%8pOhXvX%qP{M5=^ zr$@Hit@yZp2WbLY^6#=}pZHK810TYt$$tfwXz#UxqNwdf7R{JbeAy0PH-Zn10sYsK z|8AFkJ4r`r4rm6nRhWZ6t8?(UlCq=K_Oc1?5%5I`Zi^p;XyaYcqSRR9X7rYN{J-r8 z%cshY(Eq+`M@;-2I|4iWBS##p_c_Z)BvE}G^74vpM_us#rWh!M2cCsw_>96if~axy zllWtNrEN*MDE%SW4G$w=wcN2M=<9iiEfaSv9{WMRO|50(L6f6$wGFx{Q*PyI*)N#E zEd>5z`*B)Jk_)8uCCdbJFO4>Uw@=XC7;c@?*NperizA@-0hLJ4i$@^K2=>Op-^l!> zN1!p?26u@Xu~Sf^V&y=!Dzzmar`iUhws97!&%Ysa0p$U4=4REInI6oUGG!Fmxx>p# zf;HN6ZkyE^6fDe76&<&NsK@iGuqR9xkAsVU+Qe^~_8dARK$4#dO}TxV&8lN}uQM5{ zMws+t*s~He5hkr`VPE`wDJh(@m|(f%urSgr}v+rG-BshB5JS=BL`8GWDp0&ByZcEBMlX zV8mUPaKj&v#}4tfs)BxwA8ZyoqHJwqz&Bp?zN`N#Fq=p~plEl|I-ct{uP$-crS=$>JP)?e;G^k>Nn839itgm+gQ zG+)nv>ir>LU0qS0qrwtBy8}_8648H9wR1SylqHoe8JbqAn6kjDZMowk>~`;LiRYL3-2+j^23gE28s8+=Xqo@ zu46K?DYEdS8pv!f?6Z$b)7%NfTwcOi7X|Fjvwu8X{vSetkY$yl$@7^y_~s#&TL}Yg z0G_DD5*E?u(_mG>z@A1|BLD5nm|4U$7^I7bgpx!1?|#WFdnc@Bv>uWd-6cliCB66E zPaic2z?CxZ;EFVADsATXV>OFN{`sds7TAjXyR`EVBhlL5TG;X@%31a+j3}7i`a|>A zUq3u@<>0I8Z4q-Fno>xfWVzGDjLXv+X8qj;Nj0W_# zb&4%6wHJ5X=4nfG`r~p5>t%rYvjnh6vOTQnic>5M(vq*KY?t@nWC`o9@cT5D2h)E$ zDD%xw}+|L55t~-%yvlcRhN5`IocPFf5#-6ZQS2M`sXX&LRFTHIN^qFRyJ$S4LgNK@$=OUj zQki+6O%w{_)O~s;It91r!h)9rk~qa~Y2iyRbyDx&*#@P8Mj-0FfKz6wcq#Rjt#$|b zlUsVxtSP5Q|8TxQbhM0{WxWO`l;rrLIZJ;5<3HISG{Bb$zW7mg;bT|! z{kK=;n|JVtC+K_DoXtOL^Bi2g-2<7`>%%G)T;-^f>S!dAl|`I97r#f&CnesyPabgt z+L$cN%!>X5u@z7C{pg8oQ4{*XzNv(>+&!r5%(QJ=OO>Z}xd%UkMQn765Qv5Mn>I$> zZ9;4MXGuJAg7S`~D{&XZ$bLqOMowRYo?wRrpTZc7n~5{klC`>$i5I6U3;XRu(&>{f z1T&SKMY@pU`Z=mTA5qWyxEw>^EkHS|6ZtSfT-v7HR~Tj$Bak;z#^E-rg@?b@{rmjy zn4_C*)v%CsTx2-j8|8VVv9ygJS~<4Kn=4c~wIt9+0GE*?>$-xOaUh*CSI4_5i$zUbH>(q^)6TK z4-QR^nX++;#zJ?y?exD#T#{avUdx80>WAPntT2Xm@vyyx{HDa%s*fo&2Nm)=5N|Mv zHx)WGiyY!qo|)hf|5?Zkc5p`58_)p5T3G6_6`57rcq&<{ndgvV1!zPhU!gjl6}S=VTN(+yz4yf1 zt%0|L;AJUp_4Tx+MnG=6i>%XgUq5b3<3_M)mJ#Bnp&Btq7wmqw*Q5y*8IH4%J=W}0 zs2N0OJ23GFn{YFpN`c2dC##PO@l;AaEU_ctg&Yr^73vKi0X%$QfgdvJpiS`yJ%kNJ zlS3E42fqM5kn6Bk1Sq8g+rGD@#j@})A3>O6yM?oyb;#cFn~hfgf%0!O(h1< zkWu*82mg3ow-uu`GGcvwOoTxB<7}yeMvN=Br6!ITSWdmT>;@-hNi--?L1-s-kA>Hr zOH;XaX$kC;O~7!6K`Sor=PeCDS^uzrBItg-cHncQuu=@G!Y-xO+# z&S1A`#q~yQz^_^0wYDKnXd^Zszw0J0Y{5aNu=2VjG?k0lMrJGRPWa$D(d%&DYF0jN9y2;;tYOV;X*98ag# zJEh^F#Mint!kKci>$eTzdJwKBFSE@))%Fv(0XLznYa6;VNcB<6#*E3*#{)OcvV(Lz z2)EPRciC$x5);KAzRO}uQ{69RU(Qx<_f=qqDXWm(#Va3pyH-8`TlYVvRS26Q9&ey)8SV7?i>OoqWsi3$N zEK+>k))1^UIrB88oDZSd>OlR&k*#H_#vHe%huPG@T$^K#AFgrbP1V{w4(4RhMr(<- z1M}Cxlsb;2n1_}DvV$qBq4@rUAxP$y)RWP;dnPhTpTJ_OMl)G^jHGaD`nlGxZ-Ony z0Qyq0iWT>Dwjp_1V`|=UTTLXx4nCtDFN_}3!02_FldQE56Ok{@@Gz#usn9)5)rw*K z1k++WbA7kADoc2&ob~hvT^h-FXWVbGd4h>Xh2F!{TU>Tu7hx5%J-x)&5z8yPq34;p zU;#HrPaD2)@?UICahvqhu~R{<{^mZ@U+`}7Ju*j^fkZRui?yQDgIl3q>n-vzn^=yX^8L#RmYYoLFx;&~k1{_~rg8Ndf(TOL-}TIPzSPkH z%~=OC%Hch3Svvbh0q?#kGrvdvcU@hxOH1?}>F z1HO43)~}+ifywitKCXWmN^~-GOc_7uu=@}1^#ks@C)yi;bJ7i4y(DeFUe_=6y!3l; z;4^Q(l}dj{R$_d7^JnO%@yus=g15u>ko72iiXoaw?i2l`K7n@P6M3A-ChUa=SO;x~ zVby1ErBO{`)h@>xaJe1Y*Gr$DLT@zHm`{G?XK$&$hL-VfmOei{P!?Clr{(7d2 z&-?6oxh8xUU&e1PeSQW(dV6sfFhXO&XSBaDYY%;h-1C3Tnm&=m9o6Jr+i>2kPrOdg zVs3*Dnr#N$OStRZBt|^0*JG@Aef9s>SWDX+8gG8#8Q|=m-dz6l4hys&J%8=^NA}Cm zoS!?$nrn^T5ccFK%c97y929%gmHi=O%3i~qm$a^#2hl={@8tj0LQ>(B(IO<3wjon> z-uL*LsR!|9jCZrI26#Z%0ct7|`=8NzUvH>jhXiXir|1pty2aQP(ZOmAuCJp`p;X_! z)U;S<0FKZ_)!8hN(c#R|mv0K9t(sYeod=8Cm|z`?R)%@HL!b;0a}|i#V4XMs)&hW{ zQ_EU;Ml@Yw!gy8~0*rSDCBZ@5@q+KrTIj&Pc%yne`f?5{AbyLRg|)^x!F$v9h_y^5 zo94ORr?}m$FqH|&QdX+>fByGtW^DhQWH8Bd^-p9dD&aMZ=KG)9e=D}3(2+B&u$UnU z66BT+4mwERLpN}(%Wk|1i!Ed;hgAf_A~vmgEqusZLdwndozb?`3*ZZ?n3tkur9>Sw_0aPdy5BAxVB?E-bRbUrdsay;py!u%(^k z4gdK(sOl(T(+gsDHp6iRy!YwmM?}XGJ(LoN0f#Ig)k}Y(h+g3Jeu}e`Htz9*(Sy`T zW^^a_OTis(I{2MT@n3RiOA`+;`?xGYQzI>f+$QsS-h4|E|Dz(mtOj;W7V~Pf+){7~ z6{7u?P9r$Kb=|vHUeHXr$uH;6uLd96vl(#+5GBw`m_n&}kMW6m_OY7AO>@(GDcFhi0aCf)ue(gM2cGJEPd-nuA^MBv&s;woww(LH5 zLHVLx`h?^`0(9Ha=8X-}By}Q7N@+57>)0r-ZSp6>Z0Y?Fp&WS{Hr&=GCH0&{yA{&< z;h=`!PJUBz&;4K9(c3N9jq91FDC+M6W>`-# zGH4-M-)LMM=-FFp&+<#DXS>{#-84Y&XI^wm0!2EPYX<#}8{hzXm(_9DX6c8Tdorfr zXP6zx)#q~Dek^X`UOxAo@~z&s#LWu*F;~G1`B}us85M?8WHw00#xs;hL0or zy+&OAr54z2-D`~a>fd2M{cegWDUw+ec^w*8vH2Dg#Q&+#@IvkSyOCV4#J`3KUfbBm z5rQ`}`>{s2T|QFq=Jx3jZ+*!iwo~>W9^P}O3*NQ&I~EDv{8MOk=H~V0 z#8+Av@#>y#kU}YLopqI;IrFze|BMm+J0uOXvT|GeCzw0u)X&0#X>EVI8UE8h?Lt&o z5!qQ>eBxtiium{;qj>q(WXn9>Yq_{LSbc#?sqIG$P+4)YWD*i0?q} z;a4<0H9O!P44$37sC)O^XNOM#Peun@#b8fQ7e8B;4S{mFf4?WR9MNLFM|)ARM0jvt z+qAkgyA`=v@8xHms)W|CIo}1(5pgT5Nx++7hMZl!2`NZ9sJzY2>w5b!q+_~h^eI`k zAMDv~a22L&#EXzf3+CW>ygy^@eP|5HYF0;%SEK!i3ZP1?W1>xAG7F1EqSCq z<)m6uI@XKXy1s$d_eOoROK6f?E~t}hy38}(Yg$si3mjD7EaZkMd{Oa&j#|03@n4`1 zp@{M&^TgTjbe8|LT`q4fM!7aCP_B1%mbY&fkX=IlN?-W8+f}I3h=1p`qNWFAHAY?5 zDZ<=^EwDX|-X%n+?Z2Pm#{5SOua-x49CfE0siV2s?g`8d(}p!kXC*(Zd6GqF0;skE z&tADVM}!X#n=o_uF4SLaeLa^GrHdozg}hw~QCWZ9Y(W)XwabEWaesmxL{Ga`zwp1o$A^w?z!^iTD6PIx0KwcomWk z{l{v}<=zrb7Y*;2VT0sZ+Ip%|5OF44?M6`7#(?x9`=GiK<&9(k!U-ks_~NCb5_I0J z(Y0>aa2mN(MN;qm@77I$m2#_JEx4}u{5j$ik8+mbN4@zyK5!ls(^`6t)<3UF7u^5- zo;IoPetnW3IHT|Wp6&trd%Jt@@9Q@0Hzb+%Yu!=%bxHm9bMAioH6_}c(U5vgbG_5+ zp2=WnF@=OYaIG`6xbj0F!2__4NKD zwL_CZ*oD6J_HEk|xJ%xq*-ZH~Sn#H|{m_N?90!5-?63a~bn(fg_O4rs{}`+D-%}6B zRDx&ePn-a3zs|>)q{7FhL}Z?^L?9MtzgLR9Ps(oC+DK-qAkG}Z(oJuIPY5hChaevc z?)2c}b6$w5Ga9EeF64`z06k#;$}UQhD5L;>-6-QO1F&WB=gM$^myD*!i0OF4_TU)zHZ<=wemfOU~!i5uPrt%`hPw7mwgcQYy^p<|ZV z;n1<^ddM1E_$(`=jylNo*mm6^`$rDVnSfuZw1-hBy5dV6v$$qhC~Deu+Xd0suFC`c zBtG2^ZVwSCa6|f-qEom{AeC0NnqwuR;7nsSF{S#<@WRMR;E|~>P{nVC zo5qAQ)u744frUYleeHW_8k5SjyJH z@kV>1PKZH9CI)#=P14T5+lp#f$;#IMgEuR_3mjI9_ydZkbI3{3Uz2`?F5WJ#`cz9A z(s-O;>wj`q39>_f@wPoCF1j<{>JRC(*3ThAk9f@&$oybkrNZ9Wc@8lLlG)J?x~--1Jp zgojLpQP%y^SNhe|TYvF@_b7``lbbYa=;2FQ7NuvIhp0XG80Z!ay8key6$lzZvdWR@ zB;DUI>)*fB9%zFyl^DD^d>?{L!a5fiNFxnhiauG}AFUt~`roKF$hmLh6#d7r4uWzS zZfZ4YWr2E~fU+Ec9MTsNC~ZZlQcI{V%9=;zM^WA!7AV*8YB_^e;C0M#pP}6A{RQ_A zrGA}JlXfIf|7Pk1l{caMd!;tSTo6UZaWFi{E`CGiaOMFu12|~8s#TYenBbMjqO^8T9k9JRNPjB^7Bf0_}H#K zoUMU~bt^6Fd4-f2Z$54J&DUa<|ev#Tgf$|EJpH|9KyOm$2_G?l81TjK)n6AH;OwE=z-9+PA;wm5YkD=;g5Rzay1Hs9c^@-iR;vhQ#cQQ z^G0%2fmX(;5VYT$08tHy0iSyNaK{3zj8`FO$2S8)I*s)%^+s?N0f>nlcD%BmZqrE4 zp!^`pzfj6kCw8sG9r~WiKSufIO8E?wt2_QK$}MM6{vpbbD&>nO4olk`sQ(_-kGKYp z|BCXzsXN|2(PT(QB+g;-o^JNs3nG$5)0v0%G5l>115 zxY=!_E-nEO(%-Qj+q?s~eF{V?AU+IW2N#!2{kVYj*oyQ07X>1GI*ml#7mZkT?jq*n zJ)FPY3PkMmC&r>fKLBy#&p1Cj-6tSbT4#_krfXf=bj%z0v`}bGleL6t(Qm*@mlVvo zZ8Kp`^nZs^^O)&R%mE-R4d}lM{r^CL&`s}JON@{pzC`~E(Elw8#Ed5(k_qB6`u`64 z|DFP|7$a=&oau!GaRvQfkN*Ezfp`P`Phr0nQ^2gY}>jSl;U0Z~kK03yE~`!`#GcmojXedf9(o{ z9T3jWy;ni4e2v&|_pttJ0}!e30q!>5dV=vn9{Er47u+KSrV6zvIHv;m!o@Wb%uS4^ zMeN5tRA4rto~}7*A&6#*uPQ#xJy0NarUv6Ys`JXwF29BGd@nx5{ir~E@&rUELHID9 zZ^bC?exN5$v=U7a-(Wo7h<&+M1>(XJ5D5fv8?vceVkGy20&(*Rh-8BJ7UR7s_TgF- zh}I_{rW3?>Sl=cwqLU)9bRX?Pf`6@;S>WmX9b zW6uMo8ZgVRieV~cP=#6o*xo=e8wlnf7|&&KfO_}aakdIN_jEBJBtOQ}fc5*@We67( zzg`+y_dXv0oTY{Ql9yi~dW-AaNzgdTl$rm$*ps`3@*70cff9rl4k*w%@}9(#r{Q4% z?CFsStB&2pr*uW!VM{!{wKk&NNi*AJjp^c7=)}i+R9Vel;%uTrK@)FSaNneh4&7U< zwh)J`6a`*zdb(t`ly_>AK>M<>o|O|w?yUs}@|`b~a$mY4hcKW(872E=zd7biH{<-~ z=NThd^pPmc@Hy!HeHQTe8_EviQ+9xZinA}fOcd}wMXUcoSFav_zocBL^ZJFK)loxr z2w|&GZhDu~q^zYJ$(5Z@ayxSUcnVuvxDvAG06({Hn46syt2N9iY$PdpqlTRwtL-=E zXkke{|L91)+78uV16(Nj%$wA{7IfBQeXsU#_j(pSg#ECfldYLBBU{u_1TXe)c)M|+ zuH$eZ=E;HRv^cx}K=cc=avUrSJrl(bZZWJUY2vB~apoRomsNap3pyP0JH83VzZk7z zVGT6$NfU#0-q{x(C1K@RYr{j?L%!NGks{)P?x)PGE!&jnmDm>)lS7YK92xbL0W>SM z)=Minnv-NMhTZ8|X^zk^W}Sv9!9Q(He<2Q;6~eW!r3zQ=xOl{v*z!WWbFHKMoX|{| z^aYrGK8#im@pAYAX3li6#wYvgiZk1o`7_|n$Jlg;iHWkU>r2OMkYh^?medFy#B=?; z)&$h)Q0o-3y4Sgi>NHcGsT5~3i&=#z(aN4uSK6fCPJQYf=+o@&|N4CdzMp~bQFhoZ z#}ym`@9mkfS}7HKDKf5RZQ(xW!0S{q#R-hdrm>>L^aew<8f!=4yi{pnUoY>RG2Wk<%UhfH%}Qx0E_e=J!l?%^wFJ(BK>5 zNOr9Qk&$E|Taz@<4NPH@s>Zsc>Q4i3-}Or-j&PV@-su~wm6hNGb)aKIf}|Z)*@0FUo?{WWoJw*elP-2#OkfPf^~T%umOLf`?VcqK zipD}d4^P&$`$j2^J|I;JA{V%H{AGuc=mtw$$fPSdF5g)l4}wS?S8$CLc~ZjeV2b zLuU%gIb*`vE_FDyZ0u=ZXu?9Gl*CeN(@65ML&ZgCuhT<}cIcX!bAhwMwfzNgNt-T* z|4PYWJS0PV`;^O}`6FzGF)H!>AU&OS_2ko8n0mYK96H-%V~(?b%ojv{`r@=U1ESu* z=GX*g>y%F6I z`YNr8c?VV&xe;K!Bh`oKZCxYXf@sLVA<9U%chv}tVGfl?s@AxstwpYJgO3@98a-j`tggPUIk&8g z?hdMdY|ZB5-CEd8EeNL2In;)NSG+v;y>gSBRL^1I>t*PNeCuRn(|j*Ew;eNr-FI=1 zk#6+C$6VO!TOdD*sbZ_zV7FXhFzG7{qjft8!*IHw37eIjQoL~;B2Ir2ioK+zy%ZC8 zA6?Lid1@L4uE!apa{)NPV`LRnPrOL1%3tdSPtc(hiu4*ND zYAW;zMWQRJQ+mkm;!}+95v42@j^1kvw;)RapG?0E$qJr?@5d8zLaLpjFm6MRy@7Ys zI=3EYcXwfYqNNc3i?DNVl1f?b5*-l+I&-2Y&W>o8(P8;Va@>e>; zEY35OHx}BmoA>2x<6#z!k1T(~@K2V*aojY8ZX@ht0~Lpike%~P`1(b(`|;N*&X&L7 zE1=oBXDoI2v@VA`l=9RnbxC8DCqy$*a8b1|QGHt4`P7Cdnl-k1_D@P_!5tR*>(NP# zkk`Vx&%=)`rFavN-=aQ`Z(>(T!^G?Eux5FuRj*E=cuZpCJ>09xitG=0FJzcBXUdF*G%vZ#4zdXM6K;p3Bm-l4bjgxo7B6!DYf{h^`e%|7Ih zR=%>=RDPPvqsc-6zYi_G!3+%5zL`>SX z*o~27|G3Dqw(!mCCdAt{W4@DC>!AVVUsdJ^A z+l9whU1Tk=Xm=uKCrNa<2+S$<6-IYIk+r0{D+Y~IpYCb9KPj+#um|YLoVVuzwM5U* zef`8)Ob(x%4_I8)%-oJN9gake$~Uur8YZlafGt4?^ejtZwZ|P;f_&fTOBcjUoQy$% zFQ`6?09fc?lbTt;bN}@u{L(-#u#522B#7VdAt;X8BkCsz*_aLTo{>xM?9pWjM`{%t z6^bgwaV9{y`ouD03k?Frm&&Mc+4-y3J(;_-@y?$|*r15a=Ga(`Bq&%*n?6C-gJcPm zV@#d{IhKylt0c$Wd&1_D9*2=>R1>B@`()1Rig4t7{{g%Gtxg-?4f!Qx)643tX2~*5kotFHXIYbItn^^+unpKEZ zhO=L>twhatMlI1Av4cEMD;V5__4)a_AUf<*v?2=CrNDt3YFY4*zBli7-0vzS-yPtv zfynEPlcKH~<+v?6&hGMiFyNEm}Sdd>2@!26wc1GHd*w_o!k<=r0bJtd1rb>xFC-6E9%bE7TNh3RW_lQSxY z37S;#_j`hfUjkjK58|HN+&6_rt#!C5f~B?*i;$XFfEHuxmUjE3L^PKWb z@9&PwvJmvSq`k$mT@trg{yHoX8M5T3gJVc4A62Y=f7eZx!!B-_TzYO4l`3_NOk}He znxh)I)RC}4TlUasG3V)GkPRn6fkD2lu%d_yAc*M@89|nd-N)| zRAV_>Xxqh4DB$q@GjGjN;NWX5_qHHjvh0PH5cS1(Yk#;>8um--$M9?FY*4#lLkUi@ z(DT7KFX5D`S*iaF*I~ny2f^ zK3$O+qux>S*_3yB<_dTiL32z|&PL;gC;Us2HWgx^p(q{%`;qFvUT;`7^UV;W# zGOn4`F)Q@=jN=1&Z~wMO3eKQxajJzI*}IYL{yuxWQ_4M*^QrT>oP(!KI!FNCXbssR zQTFf0r3b%(7eI35Vt8C}G)u_G34Qkj#Hj3&5Mj3EcpW;1xUueWK#9|Htv>viLj*Ng zX6v%$x}C65Ywei=?X1C|^m^f)fxt9QjUhDf`+NFr)C^UBemTm9DqRSnRrvZE7?9GP> z+F+2}un{hT535|K1KAbYgUAX;gq=^Iox*$WJAal0Z$T?!YE#R?7q`n@y3o+tGFp$C z)E!mon#}w1*O#(uBv=G~lsn4)sq<*gq+Dx`c%l$duv$Y*tL}$@CN07!wzg~Gd)TY{ zNL@zCcO;M2KJE^!#5C#MRDJpnb5&miS`AoaCN~K(cKXuu(^nF5-TtjFV}(BF?e~93 zquGtCpt-%`FtxRYe3fnbLu&}xG|;JB6y%kR4;Hz>gMGO}GNDK4P0q{N=9ttTS0vcK z24*a?-YFn@gi$oX60vixTZ5)yb~oWJxFjhv%bd+h-(HUSi$o5b!2C7Q+;#r;6vEnR z^%2@Xuv=DVZzimNyic_UX43OdEr%P^qhC_M*D-+S?gK_JBFr_>yWqC z^a+E=VKd^sJT(0zvImj;$+Bp9%MGv7dPmOjvCqD4QpSmR=P@bf^rVWhcKz8=HP2Nc zpKQy=mD;q9S*AZ4G$L!ziYdj~jY5nt%1RmiPD+Qek2+$qO`wsmJ_&bMXIa(AAIP+h zRnx%QLCx}uNLjF#80+*WXAT=zsqTP97Q!Hq6A}K<68i@T2OfyN;-K++OTOPk;uqd3--b zfLgn*SoIOjCf{Hl17gHi^SEgVM}Cw&zM10PvA{PZhfwXPO@+J$H>*FzCb~S#K${Cz z?eM{L!8Z_hp4oL5a-~e|r`TKE31!bz>{B^`2w}}k_<20~Iiz&*a=8Qxx_dgcMQRPT zk_9H!x>2bWbsk^kmTUR5@4=HLQgym)#U@)sR1&?87;fuG!l7wqFD`=g94){@l)adO z=aeODBEY5HfwfKUJuN(K1@YZxhUN(tXD7Q;1?WY7GyKN9?onr;w9>PPE*2DcjBOVmmnc2%@4@r(=ddr@c9vqOvwu+43sUfpNxASaV0OE{sq zKvYF=)s-$j8m-@B+}LBltDEM--`xmVu)?31b(p8Yz^a2e=A`tJ{v}RX$>?{0RTCQf zQg3jU(v=?NEtcSkkhi!%*NhVta~fH#?f!(8KlQIPLA#(i?M|XLgj13w4ViOds}0w2D97VqA{Z4~gPjB#3Vy;(zGfq4Set zAh{v0ntgT&9BCH#El!hq&`2uF=dgB%7^}eFNSi zi#)NFxG>0tg6vFM14LF+Z0wO$^0UJ4Gp5BU;Wx#@^1rWe=q&{3Ltj4@Kwh8cQzC>rLeeL@D; z%L653EmUgz_yV+!Q|R3lX<*>p^1nmtmVw9xdNGr?n)|mJsN6Plr*TjK;>B}lKh0MC zi9W(&HhdzN2kNVXRxfS8+_!NS@?kLd`eck!=078vIP3m7RNHvDtfaGS#A#?9Q{{G~ zRG#3)3)}>A$R}e`;3NOyNoXx6*&1REmAN8vNPj+`6D~$l4lHGTtnSYBsVEXYzqWrq z)nu`h;CreIei0#vd|r+ACzOPYF;c0EyJ;M$j;9LsKTmIA#muyhrEiew7%hK%4D<7x ztvXyD<5Wut^NC!FNd1-23O{SR7%P{|v`9{~MlE}>9P=|4QBUQvmn_v;lCz|$?;BGm>< zKhg=yb=Cb9?Z={j#_cpF^cyymMk!ac@zIDDYusha%QbVYz_U8zhj@maul!8)n79`0 zVH>if>y>v@;}QHW3H&ajG9G0Ov8WL-b>%Os>8+tP73;YZ=cgalWV7r{#fc5{DSrq0 z|CI6`^T>q;-iK_*`uA1dSK)oM3cn5WA9#NO?-Nw`4^V#}1^y=9C#&#VP=C1cz7_AM ztMKom{@%)aoyEj0RN;$Ie{VVqge3?UROU8+=h9UeO6^62OArwS@%4frgO+DGdf5Er zQsXAr@uv1fbig3OHs>X^G^5F9#hVB&ByAw&R;w7po>pPK$P3mafd&jpY;>9i__YxRX*X8WgJdx zox|Ic`$reernbH|)4bLg+P_@An~3%TjSz&$A-H|O9b7z=JX+e5OfnGSP`hM!Lmm(; z(EuE>ANX*`EB9G|PFQ_01hKDEDZU4CXyXn7_XjB}bkqJY<;Ga?_&zLu!8uBT*Xwu~ z=mBg%J;4Qa(1qGxxfuAOMg8K&KUabeiVmflp8CfLMCF>ZeOHhv04+-JLW3pk(+!NP z?P7@N@ZoNVhm?E3y+anYE%93i(;h)5P`u}6AO~ofDCa^pXX~z1fjGQOG={84q)e)E9RQv61cKp~iM~>h;WFgsSAAUJ7NA2nt z+nOY|nKMRDb<<3pagSRWb4`|3P_Er8q!*lZ{?}(Is`kA4S5L>~#Md0kt(t7x%WM2A z^0T2W1h+1R2kC5(Q6I9fo(7|+afg0v;zVa7u z#Hzp%^!zb)cKH4cKzdXUJm&o%YP@+GyeK=zc-lshdgefB+oaY=q8Qy zkUVb#%au{Xc7iMp3A@)nJ_8L~`S>%WSwmz!%&{W*iL;M#`WHS1HW2%_GoXGqwD2*K zq7{>K3PhKGzEy~k#D49Je?x-)$+86>_=}VK|n?W-9hG`g~SG&anEok44-@oD%5$T5*37rW?Gegd1Zb zSY>1jDvY7kp{s@tyu6$@RI%kj+4Hz zAp*OUD*m~UQK)YHI?j5zJc8nf$aIg)g*C`gw^nRBps`$b`>cX zSVlv}_&Rb$_2*_nV@#Srg?qtVGBp33;A(3Kkx&16AJg?s7w-p&&VhHn>5D!)j75H$ z#lSits$2o_JS%P#1@cL>+-RY)fdX_Fw<%`UKD%6AI1qQy0@qu}gI?V*I&lN@W_g;0 z?h$`<*juWMG;s5rA14gMd^S85;Z1I_^v{FjeC1bXsqbAe!p~ozDB)k9zIBqu5!^&L zk77X&maKCx&FG2-{o0gEQz#;IdnB;_(vksadX^N``m)br;Q9ebLG*L%8N zrlt{xDRApv3Ea9XCg#EuFQ#2@>QOb8D2tO)Cm*pB_KdxichH2VDYQo84p6qCE}c>4 zX($7C>^P+)c{?b(P`m;40r-pn{I-4eRn4|x>3YO1pD1P}aZNt*T?KCZueP4Iqg+RZ zF;WJL9u`p)tDb>5J16Bfdjn@8hl8&J&HCG!cMc;a&_tUMrKil5tgsl*MSAh+Ha)xt z@$A&24m{t)^D-WHwhs0b6K%8i>g5cSf*o;d9GoPG%}My*1)eQKqUfngUl(qRyL3|K zk_~;8H<_;Ag}ws(Fmaplwu?Kc1r4YL{`|npa<`-m$ne}4=`_f=*6nj%|A5C z|DUsWk89#i_s1uhOeR4M4+f7;i`;MXaqTDoShXrJCMsK!J!iuq)!Nij6kat_E8W@%nu~GZ{eZ_WWMIKa|PL z=l*#<&*!;6-(Peo##+)N)z#$|yzdXY^u{4pSac|g4s=rio)GUszA?W<_%J9;%w18*Ul59d;2D~w@Gj*K zcbBw>crEZ!y2+}4c5gZ|vD=@!#0gC!%~@V%MxVoo&t z&78OpnK8v(s9P@YLe8nVU(k#&AEWp3`WpmS<=VCskweTLa?n?aM31fzYUq2#V<4Fhro}~DxRT}HvRB66D-=qFNPdC5oZ7xf!}{+<7>=^ zZ6rC+@v8B*R}iUl6|EMm;*gbdxx@uDjyR#c;BU-nLR^k3mDZ+jNFr4|2if8aohs{S zWQLB#$zMjc5Hv>ExQ&)a8T}vB+D6;70DV)4D3`D;|56+~Ng_C{vTNM4sVwOBr_YEm zHIv})2+H^2KBw~pEHl3&x;#jgBJJnI)cJu{M>L?+5biTedZ`*R^ld_R@nC`#eXsQ? zB+muL^lAeqx1mO=JuCI~KRW+Yeh+FzaGyx0LU^NNfU}_DuJC#@69UPjuV0ZFu}uRbZ3A6m2+$=tHK-TK zRa%UhJdFhWC?v%Jp184a557LcZL$DYppJS+bA@vDY;X%o|GcYX1Lx|7Pwfm=jeo_4 z=!f;;=Z-n(gvqN|^(XNR{aB$wd?{5I1m_0fEJ`qR5)@!y|Htbzsw@d6o(;TX#-0eLc6X{-W=FG)2Np1(#oUdHV!kA$t7===BNfP*%q+v6$=CMc$=mc$5aP)GT1B z838Ocp&X^cI7GcYfl{zL=qmLZO2KObD~G7NWhga>D-iLJgD;Trkdq{$6~IM>yfwdM z>9(b_id8wSsWze&(!$~AS5WX1Q45GRU+16aUjd4vC1*KlB6FhWXG(O!V_6cVMWs!b zsWkBMyAth?(^9yU=$d4rnG$NQC7XIP#LwCzVXYNMI(P%+^}!d=QoW@odIz2pkwINN z2aeZso9JQ=kraL4cyp@GWh;;uf+#rR2g!RB;o?qNOwDmSnl~b9>j!%S(bNe`+H38I z#_$vyx%0b0*q3D6aVu!Vs+{BL7&c%&Yg%DRu){Wg&zi<1QcZP9*ACA}^(o4Tp1;~`@pzu- zgvVIxf6P2$18;IP&SFA4CD7m^HazXeg2MK~a`pK*$mrsp`HAL{@-Z^Qz6Hs}Re$tj zu$5eM*q`lgElK)sL_2O7=8vA=r+ari*ner=d93^W5W{ytj3;m&Z~_2h+gc><5GNok zoV$EeYCAekZnx)t_H4K5l!P5y=KaOh%{h>yR1xm9^SxpZu6Ry;*wSof;`g&=o5*<} zUM)kbh}gpB$A@qSz}e-NC`mH2W}n4u9i%WXH6_7fVpZND+zq+yYTSJG3+nDMqGs!wYJ3ZB zqbOeLHpbg$1>&_1D+A1cKbHArtVrwK(S_^N2X^%gvFhkQNTEvSo`@Otln_Um$9Tx#i^FR9KDL|J%U)IxPfm|`<+Oc64% zMu(O2F$&>a0#BSz>>^7IqEGZL4Rw+Ajh!S@{UMp67*U{gHCnpQp)~_7+H&_0EHVsR zLldoo>haqU7D{iYe@pb-MmyP`)_oD6>1L#U1ACkvd5lTFCAQL<`Y-33CwhaPv4cY9 zFNzR}U(hf(?dQc`0-}Cmw_4oD6B2USVuYUqMyiJ|4qGS50qE4Z-HF!cZzCr9SNQAJ zbsX*O)ppzfG`FPICt9Z+*+}*yE$%%u(s``-tM#4pG~!eb*?meQHZAxUi4?u^XQX~YD=ph3k))GN zP-$JJ5knB+xJ?L_d6BwOxyF!>I$i9;>A3Z)l$M9Bj1Y01u|ZpVUF2FIHO6~jq7S>u zZ+go;V2TsAI!?9kuF%od;<^Q{DR|EqG*iY-5t<>vpqr$?wBaRp->Hr(Q>GG)q*Hg? z6>fTz(l_;{EpFk%eu^i+3AOU#x7(gTy@JXw+@tM*Hnuq2tUjH;h|!ea6|PHdKSVqK z$x!#a4DI13CSpXaPD3N&6;iFbZI8MCJ`r>2=o-t8VJ?irZauWZbKLWU;qh$tVXJ!O zfxjDejBaF({`2~QC(>Wbwme*;{=DJu>GZC#;rM|kGLojk+L~S2@WfbsWq)?z-j)CS z``CkfS2SPuJTXQ8$sFa%v#(8sE>W{}Z`)qI)u&<;(lwtWR-9FHy@55?XcXzVh1Fh; z{~=cOIa{YcjNlWhUb3OYjG9*leWGujXT zjMPHX4qtVLb2+WOPT6^uA3cKpm+q$fVeV zwvWym$(cml5FIl((HdFpk3Kgr)^_hbE{%(C-{6v;c1yN!N!kBE`2omVV1Ye#Gi

=T-GOU)7A2zewlwzTO~7cdEEkI<+B@%OpCF3*19x zi}a4TA^K%;F|=NEd+BX)F-}*1rhHjjG@UyA>b7{gA4wXY2kEXSL|+g$l;rZ#y-DwF z;(N4;cgXB>C(#;lZoCcmOG_d$nc^OXep`Ey-lU#Nv??x?FN_s~ocAWX=7D*fL?m`Qt^E4mm~rh6C@C9f7}W{3o>XAx6UVdHW!(EqGjk`(|~U z64IJSHLb~Mq$H(i66K^W@%OAi$iiybshDM`M=TJ zTUc{Vjw;s{kZR7zIVf@M8k##DU{d*1g$G7QwxN`2(`zy7q8z`lw&GV3K5SdFxLOkJQ`U4O9vkt3w`#e=odJ)OFApkRjnRFRxqTwGGq$N_yHE=3DK#mIMJ`JOtimv2{FR@ z5ufU`)r`?`vzQX`Ju`*uBGRF02>hOmtnNW1{eO%&J*B0-CP*LmIEzdVLC_{E@%7=T z;}+B0=*_VC!MsF`xTn{y64uT$Q}D%sFONOo8(Y6(#DLS3lhD~8nX8AXRER+CA33)Z zaYN%cw$}PP{O$lncGco(8=rAH(rjD&AuoRitc?O?%tAj6o2|#6D97I&$w>+u|MotM zCyotd1rQK-9wUMUDsR@3H)+28X@d@#b)KkVJ?kHK`bwB5y=XsCky&)$G0eOsQOBjL zq`4c+gk!R7Qhqd1>tI%?uDjqaEi8nL9{3-yJ!B|8Ys4efXFp%|3IOyJGAZr4mZT&J? zQ4HyGjTY7rH(*cO>wfvU<3S-okF9FcSSG79c|J%M!tiXK7^Lgy&xHGI zSTi4@gtY}(hSg|xn}yrSA{`?74%%e;bi|4xw+jNXM9Nj!}toptyz7ftwqz)pGO zG7U?p{p!U_;k}T~o@kKUH6&1ZDqTsm)Zwo34k}-?IPZYPJWCsZm0oQcC;wSc${wdZ z%BWj3Hb^lpFOwUK=-VMHcwzZdybuwBQ>?eP#p8clTeNOrFzmCj>hFCKPm~3q2|kvp zL&Az=1!Tv_il$;fD>qKxj4uo_#xrfqlj~VyjmBS^e78xIKfHJxA0t}5k9y!z*6w9Q6e;y z;Q83cT7m?j2+wstpe}ohGb)GaT>I5LGY;-^1QD z#)=j7E-K0AP?dT$*s5aD6`*FJN7_#9k5?0j)TWY_?FBkoC z(yxQ~)l4N<*P`ZW{PNMSV*2$j{KBoYNcgZ;W2wD`U%UdpN@}6k4mOf)jSzkfk?@}$ zU7K%PgoxQ{r=(R0S*wsn#RMfD7BMuJPFC&`e!gSz+|mjkBrE=lBEnUTa712!enkO$ ztg4)ak+p}3hiW`)hcs}Hcvm5cfWioATNTMl6vpr`^fp!WqdWChYXUb8zOu;epbOfs z+47YoLBr@Y`!qJ*`%cFV8%H|mv>luonKr)ezWw=7ubuxo8Mm6n*nBI?=G+O-n37C4 z-F>sad2;>>M+v)R9e?p#@;z3cp$y*RkG*`51tmk{5%2bocm=!JtPsa{AYmF}9N)E> zE$KGIG%aR?_Q}X)2D&D!@sW^=grEMM{@yArXs(0Ind)I)o zA9OxQi0q|Fw2vzThGcZ_#WPv&vGH}G;d?6WHnsOy(;X)wK;v$Pd_`c6s+XFCen*v0 z{zPY*w7905bfzIyIk;fbZnx0;yfVe^06*V$C(nGuJ@?jsFnUBGC|5tG@Eg{&_4t)N z!h#i7YuogS(!S-2CnNG)S8x8s<<<1M#U?D)=9v{fr|0Hf+hVNk?8!G%?6hJwlcjb} zYMyz6OJVk2p4{0k(rNI!VxTD=)h(&2v=gmjXEKb6pTLRyPo8-@e7=b4u$i2EbeK1? z`HsKw&z1`=s!LkmoUrE=&vQ9pkBRHe);2cxB?!OBwtr_qsXFXQXUx^ObCEdv|xZroIsEmf8&%9~ zF`uYp87k2zf2`UJ4eanmzjy3fBwViuM${>z;J0fg^`#q+?1Sj0i)_&^TOYl{ZUvob z9tI6lkj<-me;5=0K09;_Jf6%vTrQSdQm48X%joUxnt=(eKDD)`oh z7=+Rty!W(0zdS+lmP@9uD@!nHj^^Ri+L-Q$jYlVJV~iPsxC!P~jbv za1*CKBn^C#54y`)%2F{FGVB(y2T!{M_hOd(JO04 z6nUn+6!jc=Fh=do9(&HLf2fmDAksd(>KER5~d8(-O?h&?Gvh z)v}c}p+Z=tTH+k)j>@x{p8JArd;!)X*uV9|TRN+%cOo*VOO)W8RN-_915DCG`j=uO z`JcuRS*wp2H9=4XG5*|l-nXg3RaX)7em#0=koFy(bKUQyAp$+xL4CQc2e(sjlG>Tj=H#=(zCbL@=rH1T z7F2hy4BZjWSIHbpOGl;k`TD6wgUOP53!>F`SWG1QoWTP57 z6P(C8)MuVIO42TFnxC2ftUoNTpCqNxe_U}?lG0GS`j2`1lKLcRLRM8IvQBZJ^tWmt zWxoY^R{*0*w*cKB8#a|Q9CU+)Cn7J(w$plQf=W|CFUl1#gTQN&y+yieRrb?+XH*3kk3fxAwg3`^!I%^2P3Twn$?D4u1-%CzzK;T<4ZYTv&^7jlI8i zCTb6II~Mwx#;np7MdqU}c_lO%w|$tT`Q8&fi)gP)^`hrJB9h z^sL$2@!K^$37F?Wsbg7JTi&DIl;5t$BOg)S*Ma_)cGa8VKJmZQ8;Eg!8R*Z^ zU2i&e@i*rO8yxknKz{{tJ)97O|HI#2QNBM$x%nUd<5XP2Vej*bpLfNf%;eF z`dHJgTW9_Dn%ZG^Rd7bC`Of8@HJ1y&U6T*RI-Hhjo<($)0G!T9t?1s32jMw>5a#NZ z>P`Pau7|N!eY32)#|PE4N215irJC;V<(i}sy;4Lqo%X!HllQLc4R}7<_^_eI$1<>A z8P0+q#;}mb3H>)RNB6EpUgvgX>hwmb?;hVvKAq&vf%qVjoJ^qw?gs5;SaVuo+`Y+S z;+WfHDT}sA((5c4&A{)8Y|JISmIk_p!Jbr0Sv3wGsW=o zpQNZnp3RcwBtx&t;cB1!9hJ+nN%N3ftgEILBe8a8_br&X#eHGe2kxd}^4EgBhg?U~ z$TOX-;8&i0R`-fpSz35{kLB2G#pn|K`xh7%HsO|`wOXe-nHlN&ff-(+f20ZV1}xG_`S@$zsV%3!3AI{e6B7S&MwG!b^x4Qmcsfmi7&EeG z_&vGjtR4m$9Y*&iuhjn3&3#GU-Ib0M+wb8;F3r3J)F|kFPdfB7h#|&53vX%G1A3|7 zC}#Y7^gI!Hr4~$jS$sc>8EZPRY=BAVTLD9O?2gBkdOq z&In%Nt>Lautc!xhmNqEcfH1?)tu{}5_Nmg863A5*qf7O%@ru$y{Xk?zbx9P2{RsH_ z#ifuqK!a4v8%X9MdFGPjRHsUBChAmOhfMDbQA`@cWA#KILAMJJmo9sH?6*CX-a+Sw zuNtCF@S9V2|EBLffAhWcaU7&ydc+S4S9$x!-ITOlWM79mQum0iRiE;(ra;E<(xHlq72 zG(?(^2V6YiWfj~7lH}OIjm%9|7~vVR!VbI8Y*88}>4joNtiq{CPPG8u6%kyM=ws38 zj!FYZFuOxDG0k#J%@p~F+Y8PEwCNQsXb3Y%rTd9zu~66~6xf%J+RLh1d$4wba8 z{Asuv-B{7@i-;Rb` z$S|&{(jhX*{LY@*-jG?Gs#enXR~6onVotFe>?b3;crD3xPvR(PKVf0jk!Oy)DB(r( zDqv|XbXTo+Z+6Q#p-;bQL$)HxS_8VU)-|_=9ZJU7VY>h;FxWwvguh=?^))!8HT=F= zNqAwbf$pi&D3$?^LOmm{WLX33%Oer<&wVvyb`00^^iN5aY)9V!8T3Qnbz-jw|hBu=A9GyAyq=|<=`5pNN`>&iBD z;QQMak4g)VUs!6a*CN-H+TuAn>gnUqY>s;Rw8e9Nls<^wsRD8Lp!4$d6`#R>YvB7f z+WBUG+#+$Bx89#ts1HAn?~jju{e9cw0$^}`ILg$ekG}jqg5#*CEz^hBXvlh=_0*{2VPoAgewKSVK++#CA3c(_G zsTua%n2{ARhiRAk8cAb_3^Q73<(b)mGx)v3Bkuv=p;2Kx^p$ktgx*}gdm(3fy}xV( ztoR9Xh8(^hax7+JDrbJX(UM@JxVp1&2FmVQq~2>r%P^8VjbOxSgHJ^llo+O3Dy*Xy zn4JZ%6nnin7}!+J)<2$#2x*vuD;t&p z=;gI+_?HvZ8N_IhA_N{yrDxd1KCVw3_c-^`{ZFe>!Y+zuO7jrutF0G>_$j zy?@>OGhj0naH}5bhE7?X=R%LE<#^ic(nmm#gADLbAK&8EKde$02P9}c@WmGq)wC~> z$lGytt0e#AnW!pQ^6Vr!TB0-QH!fK?MnD?qP_#!F3x_8=hxeM z2kwd;u>FC|fph~zXG(2^%ns*n!&h0Rxy078!@?@9{_L<`iAc5W&(7|{)o(Wz*P{I; z?a%`&jKcDEC(pNY>zXP8B^9jP(KoE!M6e!bl%JUdAi4w zLFKSRYudD3I+4?Vz+D`#YNNZD9h%?RY*X>vU{~#yGfrFkC4t{1euo92 z=8#Lju>x9CY zPW?Lk?)uK3(wFu8ZcfyH^27D+^88u-$N1eev3 z2hsgXI~2Iz{u>sX6hD{aZu*xi$Kfu$DDSS5tAh0zC_+SFqj%Ve8`~En zGwGdQ;5i-GT^RCVf9$)Ws--8-uBm}1^RB2`>7DtjskJVQ$7xU47F933!?G4r>~}hKIP!g!B3rf#Fao#=HEp%1-^bcHSlD1MV)X#rGu}gsV7_>vBvSJ z?*ipMpBi}LzkE6{D*o%Y<&nCc#;7PZ5x?^7!1&Aq->#QNS~2x$j6jS!*Yx%w*Bolu zH|FWUNbO(0eMBn9Kl5~xi|6q*;pp3eQSq*)PqhPq>=t$yfCBcP_g)k9lv4 zqtZXjsn9pFeYb0*@!EIlyyub09M581AB(!dQk%Y$Xg|pHrWg$m zarp3FTpb^WHiM;^*`Gk0!MIhw#r?ZOPAnjCq=Tzs^ZQCVDpAQ z>9u%W51Vj_uS;}j(m;29F5<1$LRh@dzUrz$Y^93yRj|Uhrmqq#J{2qwkXs!&I2!9+ z-~yKWl(5?r{kZ_ep^~H@@`j|db>mb<7xKiu@4E%t$U_0yOIW8HQL}i<(0bmVy%zTC zk6!SHRX>fth-ALz0IWn2mvA+1t={{gO>4co9x=7LsB}55TS&bQ`U{Hjl{|+|CjXTj z7m`C{t)U87j-H3DDyWbVRZG#D!!2RyA@8GIw?F$x3Ov!D1U2&$XzoB{Eh(ZLzVC+2 z9VlB__D)`qV+RcF_#`M(OtkHWiG?VTOtRIg*zgb#fxl>Z{IYHTN>{2`hm*1hm^ z8KcOnF{oZzg*p4M3Z#c>$vH|^ynvP^n9o+scLe4Ok0|$Pee{zG?AK@TQWo#65uecd z+=lL)JmwQY{rBD((sjGaJw((>*pUCvDb>i6fOXfaYz%qPz|W(l@DNc1GKE3-t4ZRI zS|@Cc=;DgH+NzdDTY=F6Z=)@#l@aw)D-y>N7WUnJJ|i#g|Kq+t*S%cx3gQPgtiv8% zq*&+_?R=(jzXNv>2~h}Xw@tv%wh;f`se^)K^BGXosvUufR$N$up-@&#f{Mg8HTw26f`6GzhIXR=^CvG zjXPYt2XKBouquF7pT>OlT^jT5O?qaMLa&;w(8m&7H|!c#OErfXIhEyOj}{|DJe&O0 zJKjuZ^N_J-@qYNesDnAlI)K`lzRWu?y;FiC6W{&*?2?`%h^R(Z6meg%w_;Btwh}aq zSfbBWVb&vx>URcKwVqZLX$akl^jgv80{c-EBE}Slt@RDi&$qz82Xv(Ju7}i0yPoj< zl%@^CiuPSDyR(HkSL%cnmI=2_%?TMUdbV;mD^7}*Fj+UIY zGzy9KlqlSA?vO}fx5Jwsu-FxSk4EFqk06Tq3Q^3(ha%5YJHru~64`_n2j+c)EjNb> z46BsCDJ^mja{EnU`*iY%7LBc`w8DSs_G6eQVP@gSk{)ZQfIS1vQ+r5SMGwy5xWIlD z(|Ip`kc5J?*MUfhE$)t(dctYA6;D~}$g4`2-3)u9-x`n40_Bk2n+~wb~t@5qn111oY+=;4thJ z_0fBw+=nd1pf#gdoITfU$R$Mi#EKQ~>+VNhFRprl*pr04=B(nDJXHKzzR1fN~iJx>WLVyfo`cFD%b@E)5^kRnIC z#-kOb!ten=^Z?D$z4OIvz2#Or zEb3%VRMHZ#H5I9_b`NMzMg{P8rIp~Z^Y{i6XZiqscyX{Lx|OV= zVm%*moa(PpHsErrl_9=U^8U>)0p^M=)##T)@(+LY&S)yf27G`wh)^JLsmS6|MRy+6 zbBG))I0@WaqL<4CvxaQ&6vzi6SxA7FT&L2YMfd{IJE|jl6;ovLZk{**?>oZ}iSmOQ zl2hVdS*0*WRmrz{H$+OM-P<4iH~3`3UXgaH;2TQ)wC7}Ts&1q^!=F^RfqX$ENrb%9 z@(nR4a6@=v`F3cpfVa$Jv4@TQEK_RhzF)&ZMt#in$4sB&4{*mcGt*b+TxM> zosT_~?+(P6Lw|^CBHkVLc~iUcNf0jDXbU&t-k3)c%(9Vk94cU_MtH_zOf)0;JV{tE z8dwndOvJlGrY}YLNK5LPa7aYxyhp!%zeJ@clnNTIPgEK#dHM`@;2v&qzb`1cJ}#10 zK!>vt^p3f|pwX&k8ljy)G*)Cff^?>5Z&^2(=?Y69YY41Q zj7(L~+K$3b-aiV^8G%s{rB1yg*4E}qYs?XezEFQF(HH)tPxE1Kdtj;o9tYxy$YdmX zjDE>|4?`rlu&@(iJh$@&u;p4;@dimc$RdnZ7x>LSsFq-Xl_-@q zP%3YV^uobBBgN2F)*yy%>lz>JjdW9YV>_vZA(jWX;5*#2g?GFUY9Xhk@oD)V@qus6 z2Y0Hf+w-J3*eJtgmlH!k_-JUJdrGZlR56bzq43%;sb3}K!yQigcTz#dT zPVWb`Z_Q7slXy(ehre$3?g^MS_dJA2lZBZNNUBt zdwAph?W}3Mw;ctjzpQ-$`p*HX_orvXvmMyA>pr!zM&D1tM8o!Rqs?*Nbpg>zZMMfD zLl#e|LC(4@QrHBEu)+(AKy2m~zB@Lv?<4t~4^IW`{gm*+Tm z_}T?1T7m*PedWm2L8mXIR>wE0#FGX{g0!iD@E5$c1JuowS_#HS-2BC@tIkIjSY(5XfVvg!2N z7AIO4OoHynd~`%!5337;Pu4sd+OBxU@}ep!mY-G#sd>_uCB=o_X|1<*sGAMm%*I>N zZ0b6?XX9Qg-+wx-HHmHj*~TFYREl!y=sPsf0coJ!(C8n*zu_v4bRKgzZ#SSsFiHf+20Zw? zeP?42=8hrHS@q$XF;39DAuVgqJE8f4)x#*R73sWv0vD=al{+>vw0K12Fc54$9+YVYh=@B8ogRb5r`J|q=PLgF$#1XI?9BpJhKvE-m#=bB_X-mIrLIYF_ zzQzM)Nuoq?O8t$kFOAK>DQ$^ zqp?0+sy2nFtXmVPZ1oBCse77WplYBNP^Tx5|M*P zsuvlAP90w zNXZP5&R+1Yd7bI^=4s!JRFyL0TzO`~VmYnu4n;UoLQeHn_;qlwg=p;!x~?_#nnbV3 zWwS&j4@{{+}@e_)dzSMLgJP?2{Bli|qJ_8*BQB;DhK@9ap6%s)2Z6x>*FJ3OfPsxGeo6 z6Ll6(MQYVP9mh<7HA7!SUFoCOwZ&3Bsg6E=eJG&yM&cr>b38-nKZzIm*rDOBNQFK$ zG_#s0AhM#cJq~LOaRr&V;QB(d3Y@Rs=$#AeLx0$aeK>7>Iw7-0UW;)2-?*$U*~mR> z1AR7oFyJu>C+W&T5hh!Bg)y&;t@mh+E+N9su=V}3UxKbW!JLLjmfncYThvNbu-M85 zc!*=HvM(IXPhY9((&cW??6Oeov0AHptd_V|{(rkxT4}9->-rGBLqrd4Zr5rdR_VQK z6-R6JsSkOB772se)yFev%`k_+YFR^Hs{Qq9MZYMm6y_85DPq}KLv#0HwFZc*m6ZKI z$y}a+d|oyj^*7ENoV)>$!VUe4zcGm-F`ZhHLFakvYsjA_uGw67SFhsAf&RhDJ@3NG zMRndlA4y4X(aK#Zn(g}4%5A!L(`O2uunVi+&h<` zL%9s;Yf+mfK&v9&xD?YO8T2J+9@r7NVggjcCA#%0VkjaC-Fqc5Y=%9?VtzA*HP4CR zjEZ!B^rw}NmPw@xE(Ri}MCWXV^};T>eNoOPM$Lf4rOQW1{z_v5z6)vpCqeyNw=w4B zZP02=-`+i*$${~xFVlF;UE@i{coHz4{umFB@%W<~*3O3ytaowS&xnCh+9v9hr8#xA z(VB9&tBr#eb293s?6;T`Vp0%mtA9)iVh->zbo0Anq}l&^=Kkmj??=EFi@QcvG>P`& z2J*^-jl#eVq zPJ_;cL5u-@GdOmlu>j{B^es2C>KvZ&1?y}Xuw7Lc75gY}xQvw`zwB`r(LE&1L!!p0 zg;Fo=j=XA=S1QpFY1+&^%#1&*KDNsdSZ^Ishv14-U+jGtnvo&j4?1K?;DT%o7V~F_ zF~}>oAwt3m1!6oYET;2{fDJLcGhsb!KB^Echs|w@sM=V5QsIiIlWHI7MNw z|4*0Cs`90uGpX&31u@`OG7wGU@DI?M2CU>w1G{StxpdVvHEpIT&j{~!#AlFtC{y+^ z+Kjk+|9KAFN*nX8S+_8qd4d_VR6lS%v&UX->f$xB&m0#PY7vhjlF>mf>h$r7a;B4+ zI_3C*JkubP!b}`VNj7mP49;*QL%&f9Tu&!6Ws2;L>Yp+E=P3rui|GoonNC(Sxw}gG zKDURjwj5d3cW>Y4@W#;f)Uu%8RlF^F<#xaJLVPnZtqb~n$zNU8R2a3lefQKU7>O#) zB~t=*j}v}xUaC|^%#1U7w z>{DT?Muv}^sx`kTOkapkcYjuxc8gEbf2MipH&v+V<|GX|D2_knH0BPYyF$OQ;<|ha zJ=ef>mYY=)wj};PVE21nos$JL7!4%b5Os{Kj zMy)@nZKe+_<@raI<(Bgr{X$r-SvN3>%t2X2nL1aeQ&P zsvWylb9XoL*wE8aJe3EYiY$6Hy*q!m9DluopG5xPZthC5!6sgkBz02ciTIOQ$E92s zFCTnm|Ev3mQ(!%#AYVa*Pl`bCkr}?^Qhd#wCQHrl`U*F$DFe7*xYo3GHm%6nj~7gO zQ2dE+$38obBzlQU;%%QS@-x%_iHM}NPr>ig{jInE=3B%QA%lRQ^*qH8b+D22IqHx= ztM61;Ol^Z<+yC$)eHRe@A_KyWijl&r@;Hy3=Z)38oB1#a+}*y z_Y@h);<7gh@7FS{>HOfxI*VscHsu^c zET+M1hHA)YyBOU{1K9cld4zAY(@LhUlqpxq#~_o(Z4$bF$@rz@RY0^qy^(wj>aV$K zxn~t7ONA%YX`4NszU7y^J!SU+AtG2UjnNZk!P?TAS<`QVjebN5Q8C|+45hr?huC#$PRj|Wa1qo~?a$a?k?+{`w zGC8@=h3DsL>+|Z<;8#%myZ%Dw?KzCMM3TJznzKGs1FP}Aj>V1x_v`%#+S!Dffr$=F zX3d~TG5a}syn;yDeWIQtjs*50^U{V$(5xO5pp(P=*DQ$cs%y?PaEtRySp_0*UDZ1C zzC0cO2t+Xm^Zyc+L76i2xqM$5i`MA$B{1c=ZG9pA-kgy!w8`H%*tb;lzxYDh6`Xn+ zUHl$Z21O9wxlfwIP7jNbB7$gx)EA)Uzd=LyrJles171g5Mqgb$wZAX+vNdO&IO56D zh!x-qz|&MUzUZHqr}O9LhJ%|NSi1K#eA8*16hUu7nS}jiUE);H1M9eWyH(np@8NFy zr<#f3L3M*)XM%BK^%fSvzYY>ep|Dwr`!|UE-W8O`DEFOH6v-ZuXGPx+7MV0{rtL;2 zpDbBme}7H+vq6+bZ2fQ-YqTrK65}2FcH`Wu();|}4QB7ajyrOxGpnS#lcEHDZdM$) zWiIm28@ASdq$}GxyqF?IFDCH|ehm_TNm=1*(+m}LF8qRjUe1Zgvd9`4(&$Di z7xR9

IsOCqOOcXZ>ohYx>y@Z`QTb>G+g^^D~s#H##LfuZ2o{>C5nT&hZ30^dLf z#&eXdTm)H}?zNk}E0+pCn6>2T>g=Bg8p}Q!9*iIJ#Hsj8)Z+V+xWIdM3uNuUDB~Ai zvcCfCZDKs&H+V5Td1TJW>FkZ}Xkz*8~T zsU3FnqR>gmbL(}q4Jd|nVB3wi95&rHJTK z1i~n}#fGm)r}=UZsq)J<-4ePZB+PyPH|agj$kusJN!n2!ts-LR)}$wiZ$tDrtLl^x zbmIx(f|r6R3|ay3^Zm$AVqTa( z>@kjFT45c71V^VDe}e^Er&=h{4wuS8ZWJtVZ44;Xer*G2ehyl*7o-`Mb9qY0khZMO z(3B$1tEC<;uapkr7aJZ6?jexAAvO<$QrjPlWXz~B7`L6m)x3?cTe_DL zbqS1ZSh&f_8I-g-pO)&>%avmp$_}-rvHc4wA+B(0*Z50lb!iQ0c4+O|lYsl&U_sZW z!rxm|gL2DYHQrcimTQezu{tB9YfrFaH*}~Yf1U6y_97@ey?8fZs9&2nu2QqOYqx0E zq;UwujqYYsHyLt6)-g z_t0RW7N}+FrN|gV?XwbG_Rgm@h)K77wK7AhPd8d%C6Og4FbZbP-JWgGTWZBb@#L7Z zw~<91tvs_sg3oC!@+?e2UG;Cuv#?ZTg|0ntKYTen;`slf%!TW8VQqZ(9kw4NY z(1&V=i@K^{Ix|;(@s~wUg4J!NWkXgda8uG*51rm>vry0pN}XYa)t#DJoRKzFao38_ zIWdLEqjCTI*bc;H>(z0MMp{Jc(M$ezx0TLNDWEHx6$Z7T#W0pi(VFP+3@GY7n{aN3 z^p)w_R~_D=rLej9y0r@;b#LCJC;__XU4R?#@={xQO2WDY5xe1e)blNkQ$1iUTEGgx zV_7b(!*8@5`HVaK$E97fg6^b1J@8T2ttrJGCtuSE$y#sl%>M~JCZL4s26`VH>2mUA zBD7q_)7D$xxuv}t^dprbh%-gYD{!_&-m6<}>-^thqeTn!IS*D`e82FAw4>b!m#2_*YD`4S1FXt>)zYp@%i|d-F)KdR?xt+7e z!#DMqO-_fBW?;vN*PJdb1NPpN&i+js; z|7sS*Z^7D^b?+W#f;E1)*yS%{`U8L0<+R?lNz}3Vee&;#Y+yZu%!&rqTt7nllMJVz zHZjlP^;+Cw%y`_!=gk%u(GYfiR8UX~tk{E?d^_FCbR$P)*wX1v5_*@2JC3Nr1qF|E zt%patkwu=n7oCAm_C{_B+*rN5w$3|%#$cfk+3f?C6qX9QG2wrD!@so!y5xo%PC#Lr z*=y*y!;Kj^@FsE_Iqm(Q8TsEg8Lzt6t!XZ~H6gDPS`xG-ouwdTw!b0YLL}Fui~+07 zHXmD|RnYD^%!Ds6+7a?-?|uzGd=9b5N(MerouP=G|r_?G#X zH;&gD^~zGEe{1f;ziyF9U_qy$7Gn594tp%WvXUD_9VmTA6wcTUVYj-87QYf#EWajL$d*?jiOTgp1ur}(lBK-e5Yh~uW^B#p5=@%t>2^6oi<`~Cw z`uw(N$d3x(ml-Na6P1|~+(CCb?{J>b8vx26fm6~qR^>Z+rUEQns=_gbQ zE1B7~pLw#zTb={a+5{<*7E;_jJiG2$QQEy*Q?l%c8rPf$D$yK6Fqh|}S`jWwf(O)^ z%+Zph7por1^(9HWDlMy#WbNY*Cps?F>_jfk>mrvLprjZ1ZiJgg0UOqhk>=35gEPfW z+@AgJ#Gf;>Y|5ADtQlwK%=qwU_)-N`FTU)d$otSTA;XC|y3)}J=x^?Q^(QCakNLe- zxY?|>nENqB%WS;R*c{B7)ePu{AswLkf4s|?g}EJ!v4-Tnz=0aP*MKrqURUGh?sr|q zZcz2=jzD2Tyb-cE*q))^qzV$=(eAk+z0Lx?xjyCm?_%<@fYE?)u!c-$aQCcV&LR&X(vLWU8dX~;S zd!-+Ef2J2!X2zML!m6NP;Lx&pFUeeXrsMbh0(qWT<@rzUcw6Lz`uM zBVyJCbn1Y4M7W}TlSinu=w69uHn`=Tg|EO(c?9Krujp_w8jRf5J=m>BZ?*UImYYJo zWxCk}asMJZuH4`6z55C1Zb@w;d5L6igv`>gFp53MuGcCkqAD!BLdh!P;sJSNx}bDU zx;w*F`xi+o@q#TL77jA*eGpEDH~9CD9b!G1(V*HM>cGtE2i}4&HXy5)1CRwPpceN} z;+@-LZrv+so2@X>%%Eq59=_YoMY2$kad;3~nGU?L{{a|;-by&1+IijGQ&umE6 zCNQMr8NqzIT~TH^u|YB1v3;p-=>>)GzBbm!Tc)a8Rco^N#%a!KIL)cG38Ok7-e1FSjAY%Ci=}` z=c1q?JM3H1Y$l=h+S39T{5WflA_+o^?{UE%j3`J^OlhG|-~4;0x>fl~!S^=UEf{)# zSZ7AO1m!WZy#UQy6Xfvuv(q&Cjq8I5!-;yWY5a`sW>^Kz_=f7V6kZh4xfxT_q36}a zLbsQ|Os(;Um8A$vv`QhU7g|a0D{8$a@=BDC&i>;c3l3AwBZ$3vk_txnGf&oITmM|I&iHxq%agx-@deW!BfUxa z{Cl&*BaSFLH}q%uxoZ3+x=G232iXUZoeq%!u)@KD!(u#OSdq+!A+DYO=p9(U;j%{9D7Ou%4Hqu`7c+ z#^yl_)r+yz4n)cNfxArcrmz3-XN(3n`&h|>wjh`T%{R!j}7j;v?cwNYF7rM2-BN1V3G@0& z4!FBFJQ&>dW?@yQipHFY+fB^{M%{Ymy6!y(BVxf<)Czglcgy|r+&2eZTrlZ|;nnn$ z=~$_g5D?N6^vJvP-eZP&CAl8}mPVCp5ecITIIZh5vvDjM?x=L6kQkNJ#~ zRzku?#7D#f4qkGx=0T8e^=G_)z6LEs2%gJSg547*{N);C1CTsee0c6)guLcBXik*E zLLYX15aZxeK4|(z$49e5fiD(cSZ}fK&Z~=?Tuyavh_I|VT7VQ@$Cq)!B44x)*}3rj zmQ%f%Ni$udQ@QoSPRJb8jUi}R4SdntTikpjQj9wf%=UZASq`XdO}UVXj3SSc9zZGB zo1=8_zCn-pYfuVS`a44@OL5dhutaU~3+L^Qzf)0OhayRKHnXJ&MOD&j~AB_Ip2fM{advP((G2>zgV+08quOz91Sd+#nGH7OfDHa zlCsx%S8IQ~b`Mby}EzFj#p3qWyh~htyObpr9sqmb zzl`jC$`^|zzN)476+N;e&)(J3>Qc%G#KQK4;wFZ)bl>Tu@vfeY76$?HIF2k?TmNUb ztgF4(hFtO}BD}%E7M-w>YTxeF;$2@j!|JWcj*k>*-CU2v`?XJ!-?7<`}YUhyyF{TLHZ_P!P&0@Yv3)xIAb8J zLDutDNYm-{`tu?|DGK%W`Z1^_a#_MC-l3q@KHj{K>!^}b{?wNqc8)EuB_8@vt z-fi03vuCIu8~>L3(fRtsqA>l#G2!~Sv~WwDF?9H%L&qriz{Vs=}!i zWA$rxEOID>+?!Ftp*MSh6JrI(O>hPbCoH=e3w~|&%^;VHXbN*8w3!UY>+L?ot#ptj ze4maKd7X4z3uqtGNI}YS&HfCXgFoA`&vOFYZfnZBf3%+|c(FkA+Gw3{G8tM-(eg3D zGmtGeb3!ln325vSbWLLb5j#NtbQTJE{1X^EtLwj5p~$d!>`Y$9OuJLPo_QHm6=io; zI=}b?qwOVFZq5)6z6pyFCdiw2Q`Ob~YY`QA2Z`Oyzu|9)cg4*+-Sg?MaGlCGaD4ef zAEUGPf@LXq!pWX!=i*-Azj$yue3%!yY#p~A{(TL8`o46rcO@U}Rdc~)DaV?NdzD(e zLpp+9Ai6Fad3qk9)wcZcRfPpsW`|c(Meclao)lPSlmR>Y5on1|HC^`R(=G%u+J;}nK)VS+PABc6Uw z!Zc8UKUqB5#3GL_VzFW-?0nDuB<`7dvf5%)2eQT3aYIg47hQ~*ESP>$a`52(fe9&t z@t?c#xs}fefABEBht1X;#UJfDb<%BNq6a!9)P=Q{v)~mq>ro>nX#${XdkME#Up7af z&;0>1Y*os(2I1Wxjb!6t?=4yVsFSoN8%1qx{VObl5z!$f#`K8hEn~{TxE1=67_NLn)HkCqCYn&L)t~#Pf{i|oNtA+237gtmk||hL@DB_lrL@@ z{$yF8|Ijqo)iz5-CjUqKv4W(qZ*5Ht>`+IjKM8UK+-8}4lOGwwnuTyK?8Smd!T<>~ zT2pRM7W%jMqrGNp?657F&@?IFiEqAPf!&ATvDm8 zS$!~UhLB}x=1!`ybFY6!!#93@wMBwZ*)DBGW$iwtpda66@l}N`nkqsluQgumY78P&qgHd(;#$@F~bv;hICHa299jgUmx>6>?(8VlE^7 z*a->O6n>exHw1Hf^zA}w8DcP)(jv6)-0iJlX8P{rzY4COVz0E^z$}|`bjs4{U6mz& zE}3$C%ChO)37e*?WI7}{J!>iyLb^%{UXT-W!XH`)|FyT}R)@yz^!Aa?N_y3gGa^H0 zS_O~1TW6b#?LXUcge|UjJ|5T)cow65unDId`6u-938zL`+4jwv8fT|Q`m~4HgVVhk zCpw+Pr0030=9qnihbS3jq><2l!Ol>_*J>`*$upmgSNH|grk1a9M~nS3H+UYUyc1o6`Mc!&G6#u7-dkRE;eF2+bY_Nqjx+I2cX8O~$_XcMI3vT7jO8LL zJtEMl{C_yverX1jCD4<8V!m0LyR^eeyVaQ*V*BitDXz( ze<>{8g`Td(Gq+v;&DC+cz+JEVX&=$O4Mq0-viEwNv_45`IrU2Sbg<_$Whp+m4<+w@wo;a-<0+oR%_He>AMXolIXWFZ!PM|1*uKu7EQX=VzHR*KNoM z3C#v+cyX3)2L5K2@liXha(p4s#FvR(2>S3v@E>6u2Ar2Qg%4(eLLATA6?_uDV8>kn z9eX^r_jjrU7G7+Ou`xjB4kfvD(C3K2|IoUJq9E->hi~#ZzCXBXxfwR4pOA^3iFZC5 zHBqbfHM0Qp(&c;7wF5}3_xaWf?;-o@QT-n7xSp9)_kZp0)Bf$qVu-lydl_ULRQ7KB zU5M(v6~7d`S}?+QH(yO-E!FhPQV2tud-S_`tz|W3y8ko9T~$er)@< zV{$U1Q^!YIke|A;%k3-Y%|1f3Q^w*tNJQf3J<+gE*H7hbl@d&jb4-u>hvKb!hJ>7%tT6j&oI6~`NnQ&7* z<(wg<9|vtmMuB;}*g{xodWycQEcpFEYfUDsV_efrCdDQ~=j=sHgb8 z%JyfGn+k7&ge9)Jbq{`wl^M@)mJe`e6Yd~NJ@6Fxg38JT@B_x3o`8Z5Mhe0^JPSMc!abGPo+QUyUEYb$CP@?IO-WZ^n9`vZjz-qx55W zi<7AE8t}~EbrEym^(PPAZ?t=pp_`*RRD6)jof;)#7Cc7csS;!fKIG?1TPD-xJ%j*4p)eWeQefZic!V>ziPs zg3l*iMRbosl?xi9zvs>4JY7d`9Fy*R8uHo@r`DDah(&jiL4 zPQS-8(2?LXi!lwR&lyY=K7Wo7MeD=9U!Cilpt$3J?qFt+fwF9IG)c=e*AppI)Z-_)oCTP-Sxmg1@=v>GjLz7-)a}&j$-lpTlKwlA9|^I`F;waN<&a}xxZGD6IoE+6)b)~Wx||>8%%6K~?!?D-JjR-z#EwC%1!pXGF{uk*W2M1EIJa&()?I^E(ze3# z0RJS1<&*LIsLluL(YF6eboSRe?dJ0y&v+{1h=SF2*3b-lp|Ka*@HI_Wq+vpYoVQ8q zp7U&mVux9+4^LCHDbB-DWYN-=eluGvvq-HS4DXa?Ao3&noR;VTc(2d7QG=M{li!>y zMV<(i&A-zOEq4EeXh&f(bPta^QpZ)oPnQvZbfPiov|9H<5&II>G0Wsc(#n)GKxo(e zln4sQxL11_=`%?1$Po@7YsR=x3^B!=)0D?i1YG@}QfHPiyo+so9ColL|Cf68i9aU0 z0{8!i`moWEI=g~N{U(C2opy&;i84JHSXSeieA9KV> zGROoER?=wS;GQ3>=5citi$^t3Tk%wKm}TVdWJfc_ZIyhvI@$4#^6lZ(w?@J1PvE_@ zlB=9TLXavdb`YF!s^(xIb)=HCn{(@}jke4b*X?#s`&vjyF?jE2K4|xBPw}yp^5(3l zWECWhd3>15;r74E7|Uid?gfHI5`h5;EPr>5!0ugQEH^V!9wHNZ@KmQx>pE}r_x?0d z$dn6(PgWR1#v*6OIcB6>h5r=eVl_{+&$E=rk-mZXUtE%&NnUCd?TEHZie9dh4#8(5 z3HhK_zs5*sbl~#6_+F0q7JLU?R5Ai`pj66rSSa`D;Ny`NO;003bSU&D@S2rdwb9`E z*eZQDvq1(HfIr*>3)*_UHAT zx>cXg?YXfFUYRdxsN{6+KbM^8;n36Tv4sNVly}ECA;~~9cSd)K)>|Yn1f=U8B|l&a zQI|)8`}f86X`sS|e0)Qyww6iUCnsbj=$hVdP(ay9gR3)$y8#`3LcdoPS~%KQ(0R>jUJSg^X-#zU z%3EEB!^HSQ*JDYx){BHfrRHTqWNc22w^Q>FkU-$6_D4UnSmbl0*Zjb;xWuJS=wtNy z5$&Y+BHNz*X^g3$u5Ab6v;sE$_7`f|N{n1BP1O-k_TekG3lYH-x-zk7C5bGSqd6T9O-G(zYw&w;)lsbpd3B-9ll*NGY4CS0O3byTr0ID($@ zx{0*MK{*s#>iI_S`iQdTP>QHq8lsyK4Vggsht>KNdp7Em^ua3`fj6l43m9avh(8x4 zS%h$Y;RAvx@tkV^pCdp^-Vo){X_=WT=xUm9KQ!9NgM_P@3-O-BZus^z;JSuML%Y-~ z9)V>|_jE^@q7tHcOD$v(`>(o6UgFX^2-U-KuZv=q;@U^5zY`x zuH4TEq3`Ow0wM5hm3lAkuAsF+MYKrM(UX=fR5R=kaRu;3!TIlP)%#X${aWoM<0tFZ zv$dQzO{}fuNgot3R9XE%sKfb1ajH#|`d9x8?jW75E;p?ptf1R>N)vHHu-owF7u&a& zu#t~87}tzqlGniAlu($c+MA{|TMQl4dFuE!uc-(iY6&YZn59K4HG(Nekn;E3jUIW_vz6h4XYVw7S48Qb``b^k zXOIn)8ndGpdw?v|aoB^bKG^M`U`Di5otLBO{`@(-C^x0ClCvXZ-DG)|Su;EHu#8OY zti5P9bo)wFoVk@%wfVZwUDn+$yKh}C@?EL5MNh5cHjCk-6+AYqkl3l7wp({~!yW;> zGV&smf~aTpM2dTLhZ&Lkc=`v}2Q0&bt>K@v!$XOzV|AYc@!)(veF6%Fa5O?4=O$Bd zoFOS6P5+jyBzo%xVhAE_@LyWCm6qPCE1(OVsJ20e3`YSfdGs!D0LIg!GK_D) zTO2J(DQvOJe{~+MF5KZ7Uj!cc2)7w|n=d{5WAd`=dAwQDU(UGEg#LZekGmH1qU%Qjr#jr-KMgjPB`|6|A&2ze)79Wwr%|Rlo8n%< zdFTSKe6qa2>z?^shAGa*x&1#4u4vrils+wEwk!OWDYhHZ*;Cx`3|>r)O=68Fb27No zh4)OoY~m6<+GMkM@}9)e)8C7N6#Gj z>QG0^HwP~MY`5^$fm!@T{|MeVg58p3!O1_K*{Jw_aozxHhvo`3K*ELw=?-X*LTgνyWnyhF~n-D3=k2(?d@R)lI`QBXLk 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