From eb40c5170128305677982c111153e7dbfa4fb498 Mon Sep 17 00:00:00 2001 From: zhiweijian Date: Sat, 9 May 2026 20:18:10 +0800 Subject: [PATCH 1/3] feat(bt): add shared ble_uart component and update ble_uart_service/docs --- .../bluetooth/ble_uart_service/CMakeLists.txt | 4 + examples/bluetooth/ble_uart_service/README.md | 72 +++++--- .../ble_uart_service/main/CMakeLists.txt | 9 +- ...onfig.ci.bluedroid => sdkconfig.bluedroid} | 7 +- .../bluetooth/common/ble_uart/CMakeLists.txt | 9 + .../ble_uart/Kconfig} | 8 +- .../ble_uart}/PORTING.md | 155 +++++++++++++----- .../main => common/ble_uart}/ble_uart.h | 12 +- .../ble_uart}/ble_uart_bluedroid.c | 4 +- .../ble_uart}/ble_uart_nimble.c | 13 +- tools/ble/ble_uart_bridge/README.md | 6 +- .../ble_uart_bridge/demos/opencode/README.md | 6 +- tools/ble/ble_uart_bridge/docs/PORTING.md | 2 +- .../docs/Profile-Compatibility.md | 8 +- .../docs/Quick-Start-BLE-UART-Console.md | 2 +- 15 files changed, 217 insertions(+), 100 deletions(-) rename examples/bluetooth/ble_uart_service/{sdkconfig.ci.bluedroid => sdkconfig.bluedroid} (81%) create mode 100644 examples/bluetooth/common/ble_uart/CMakeLists.txt rename examples/bluetooth/{ble_uart_service/main/Kconfig.projbuild => common/ble_uart/Kconfig} (75%) rename examples/bluetooth/{ble_uart_service => common/ble_uart}/PORTING.md (75%) rename examples/bluetooth/{ble_uart_service/main => common/ble_uart}/ble_uart.h (92%) rename examples/bluetooth/{ble_uart_service/main => common/ble_uart}/ble_uart_bluedroid.c (99%) rename examples/bluetooth/{ble_uart_service/main => common/ble_uart}/ble_uart_nimble.c (98%) diff --git a/examples/bluetooth/ble_uart_service/CMakeLists.txt b/examples/bluetooth/ble_uart_service/CMakeLists.txt index 1982eca7959..072b63c1507 100644 --- a/examples/bluetooth/ble_uart_service/CMakeLists.txt +++ b/examples/bluetooth/ble_uart_service/CMakeLists.txt @@ -2,6 +2,10 @@ # CMakeLists in this exact order for cmake to work correctly. cmake_minimum_required(VERSION 3.22) +# Shared `ble_uart` component (must be visible before `project()` so +# `main` can `REQUIRES ble_uart`; path is relative to this example root). +list(APPEND EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/../common/ble_uart") + include($ENV{IDF_PATH}/tools/cmake/project.cmake) idf_build_set_property(MINIMAL_BUILD ON) project(ble_uart_service) diff --git a/examples/bluetooth/ble_uart_service/README.md b/examples/bluetooth/ble_uart_service/README.md index be4235d9af8..88b2311dbda 100644 --- a/examples/bluetooth/ble_uart_service/README.md +++ b/examples/bluetooth/ble_uart_service/README.md @@ -4,9 +4,10 @@ | ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | A turnkey serial-over-BLE peripheral that implements the de-facto -**Nordic UART Service** GATT layout (RX write, TX notify), so any -standard BLE-serial central (nRF Connect, Web Bluetooth examples, your -own iOS / Android / Linux / Python scripts) can talk to it unchanged. +**BLE UART-over-GATT** layout (RX write, TX notify; fixed 128-bit UUIDs +below), so any widely used BLE-serial central (mobile GATT client apps, +Web Bluetooth examples, your own iOS / Android / Linux / Python scripts) +can talk to it unchanged. The example ships with **two interchangeable backends** — NimBLE and Bluedroid — both implementing the same stack-agnostic @@ -19,7 +20,7 @@ manager, advertising, pairing, GAP event handling — is wrapped behind **two function calls** in `app_main`: ```c -ble_uart_install(&cfg); // NimBLE host + NUS GATT service +ble_uart_install(&cfg); // NimBLE host + BLE UART GATT service ble_uart_open(); // start advertising + auto-encrypt ``` @@ -53,12 +54,14 @@ The `_ENC | _AUTHEN` flags are turned on only when `cfg.encrypted = true` | File | Lines | Role | | --- | ---: | --- | | `main/main.c` | ~70 | NVS init, MAC-derived device name, install + open, RX echo handler. Identical for both backends. | -| `main/ble_uart.h` | ~260 | Stack-agnostic public API: 3-field config + 4 lifecycle functions + TX/status + UUID + `BLE_UART_E*` return codes. No NimBLE / Bluedroid types leak through. | -| `main/ble_uart_nimble.c` | ~670 | NimBLE backend: host bring-up, NUS GATT service via `ble_gatts_add_svcs`, advertising, pairing, install/open/close/uninstall. Active when `CONFIG_BT_NIMBLE_ENABLED=y`. | -| `main/ble_uart_bluedroid.c` | ~900 | Bluedroid backend: controller + host enable, NUS GATT service via `esp_ble_gatts_create_attr_tab` (service-table API), advertising, pairing, full PREP/EXEC long-write reassembly, install/open/close/uninstall. Active when `CONFIG_BT_BLUEDROID_ENABLED=y`. | -| `main/Kconfig.projbuild` | ~40 | Device-name prefix + RX scratch buffer size knobs. | +| `CMakeLists.txt` (root) | ~15 | `list(APPEND EXTRA_COMPONENT_DIRS .../common/ble_uart)` before `project()` so `main` can `REQUIRES ble_uart`. | +| `../common/ble_uart/ble_uart.h` | ~155 | Stack-agnostic public API: 3-field config + 4 lifecycle functions + TX/status + UUID + `BLE_UART_E*` return codes. No NimBLE / Bluedroid types leak through. | +| `../common/ble_uart/ble_uart_nimble.c` | ~650 | NimBLE backend: host bring-up, BLE UART GATT service via `ble_gatts_add_svcs`, advertising, pairing, install/open/close/uninstall. Active when `CONFIG_BT_NIMBLE_ENABLED=y`. | +| `../common/ble_uart/ble_uart_bluedroid.c` | ~1020 | Bluedroid backend: controller + host enable, BLE UART GATT service via `esp_ble_gatts_create_attr_tab` (service-table API), advertising, pairing, full PREP/EXEC long-write reassembly, install/open/close/uninstall. Active when `CONFIG_BT_BLUEDROID_ENABLED=y`. | +| `../common/ble_uart/Kconfig` | ~30 | Device-name prefix + RX scratch size (`menuconfig → Component configuration → BLE UART library`). | +| `../common/ble_uart/PORTING.md` | ~724 | Porting and API guide (integration, CMake, sdkconfig, thread safety). | | `sdkconfig.defaults` | — | Default: NimBLE backend, MTU 512, SC + bonding + persistent NVS. | -| `sdkconfig.ci.bluedroid` | — | Overlay: switch to Bluedroid backend (used via `-D SDKCONFIG_DEFAULTS=...`, see "Choosing the host stack" below). | +| `sdkconfig.bluedroid` | — | Overlay: switch to Bluedroid backend (used via `-D SDKCONFIG_DEFAULTS=...`, see "Choosing the host stack" below). | ## Public API @@ -91,10 +94,10 @@ extern const ble_uart_uuid128_t ble_uart_service_uuid; The same `ble_uart.h` API is implemented twice — once on top of NimBLE (`ble_uart_nimble.c`) and once on top of Bluedroid -(`ble_uart_bluedroid.c`). `main/CMakeLists.txt` registers both files; -each guards its body with `#if CONFIG_BT_NIMBLE_ENABLED` / `#if -CONFIG_BT_BLUEDROID_ENABLED`, so exactly one becomes live at compile -time. +(`ble_uart_bluedroid.c`). The shared `ble_uart` component's +`CMakeLists.txt` registers both files; each guards its body with +`#if CONFIG_BT_NIMBLE_ENABLED` / `#if CONFIG_BT_BLUEDROID_ENABLED`, so +exactly one becomes live at compile time. Two ways to switch: @@ -103,9 +106,9 @@ Two ways to switch: idf.py menuconfig # Component config -> Bluetooth -> Host -> NimBLE / Bluedroid -# B. Apply the Bluedroid overlay non-interactively (great for CI) +# B. Apply the Bluedroid overlay non-interactively (scripts / reproducible builds) idf.py -B build_bd \ - -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.ci.bluedroid" \ + -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.bluedroid" \ reconfigure idf.py -B build_bd build flash monitor ``` @@ -130,10 +133,16 @@ When neither is enabled the build fails up-front with a clear error. ```bash idf.py set-target esp32c3 # or esp32, esp32s3, esp32c6, esp32h2 ... idf.py menuconfig # optional -# Component config -> BLE UART Example +# Component configuration -> BLE UART library # - BLE device name prefix (default: BleUart) +# - RX scratch buffer size (default: 1024 bytes) ``` +Those `BLE_UART_*` options are defined in **`../common/ble_uart/Kconfig`** +(the `ble_uart` component); they appear whenever `ble_uart` is part of the +build (this example pulls it in via `EXTRA_COMPONENT_DIRS` in the root +`CMakeLists.txt`). + The two security knobs are set in `sdkconfig.defaults`: ```ini @@ -152,7 +161,7 @@ idf.py build flash monitor ``` Expected boot log (NimBLE backend — the per-characteristic register -lines are NimBLE-specific; Bluedroid prints the four NUS handles in a +lines are NimBLE-specific; Bluedroid prints the four UART-service handles in a single line, see below): ``` @@ -174,7 +183,9 @@ I (xxx) ble_uart: advertising started ## Pairing & demo -1. On a phone, install **nRF Connect for Mobile**. +1. On a phone, install **a BLE GATT client app** that supports scanning, + pairing, characteristic write, and notify/CCCD (many mobile “BLE tools” + or serial-over-BLE utilities qualify). 2. Scan, tap **Connect** on `BleUart-XXXX`. The phone prompts for a 6-digit code. 3. The device prints a fresh code in a banner on UART: @@ -187,7 +198,7 @@ I (xxx) ble_uart: advertising started ``` 4. Type that code on the phone; pairing completes. The link is now AES-CCM-encrypted and the LTK is stored to NVS. -5. Open the *Nordic UART Service*, subscribe to TX (the down-arrow +5. Open the **UART service** (UUID `6e400001-…`), subscribe to TX (the down-arrow icon), then write any bytes to RX (the up-arrow icon). The device logs them to UART and **echoes them right back** through TX. 6. Disconnect and reconnect: no passkey prompt — the bond resumes @@ -204,9 +215,26 @@ bytes with no framing assumptions). Send replies with `ble_uart_tx()`. ## Reusing `ble_uart` in your own project -Copy `main/ble_uart.h` plus the backend(s) you want — `main/ble_uart_nimble.c` -and/or `main/ble_uart_bluedroid.c` — into your project, add `bt nvs_flash` -to your component's `REQUIRES`, then in your `app_main`: +**Recommended (no copy):** register the shared component directory **before** +`project()` so CMake can resolve `REQUIRES ble_uart` from `main/` (same pattern +as this example's root `CMakeLists.txt`): + +```cmake +cmake_minimum_required(VERSION 3.22) +list(APPEND EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/../path/to/common/ble_uart") +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(my_app) +``` + +Then in `main/CMakeLists.txt` use `REQUIRES ble_uart nvs_flash` and +`#include "ble_uart.h"`. + +Adjust the `EXTRA_COMPONENT_DIRS` path if you vendor `common/ble_uart` elsewhere +(e.g. `${CMAKE_CURRENT_LIST_DIR}/components/ble_uart`). + +**Alternative:** copy the whole `examples/bluetooth/common/ble_uart/` directory +into your tree (or only the `.h` / `.c` files into `main/`) and add `bt nvs_flash` +to that component's `REQUIRES`, then in your `app_main`: ```c nvs_flash_init(); diff --git a/examples/bluetooth/ble_uart_service/main/CMakeLists.txt b/examples/bluetooth/ble_uart_service/main/CMakeLists.txt index c05578d30a9..653ce563147 100644 --- a/examples/bluetooth/ble_uart_service/main/CMakeLists.txt +++ b/examples/bluetooth/ble_uart_service/main/CMakeLists.txt @@ -1,10 +1,3 @@ -# Both backends are listed; each .c file body is wrapped in -# #if CONFIG_BT_NIMBLE_ENABLED / CONFIG_BT_BLUEDROID_ENABLED so only -# the matching backend produces code. This is the standard IDF -# pattern for conditional sources, because sdkconfig isn't loaded -# during the early CMake component-requirement scan. idf_component_register(SRCS "main.c" - "ble_uart_nimble.c" - "ble_uart_bluedroid.c" INCLUDE_DIRS "." - REQUIRES bt nvs_flash) + REQUIRES ble_uart nvs_flash) diff --git a/examples/bluetooth/ble_uart_service/sdkconfig.ci.bluedroid b/examples/bluetooth/ble_uart_service/sdkconfig.bluedroid similarity index 81% rename from examples/bluetooth/ble_uart_service/sdkconfig.ci.bluedroid rename to examples/bluetooth/ble_uart_service/sdkconfig.bluedroid index f0604fab87d..521b833b3ff 100644 --- a/examples/bluetooth/ble_uart_service/sdkconfig.ci.bluedroid +++ b/examples/bluetooth/ble_uart_service/sdkconfig.bluedroid @@ -2,12 +2,13 @@ # from the default NimBLE backend to Bluedroid. Use it like: # # idf.py -B build_bd \ -# -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.ci.bluedroid" \ +# -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.bluedroid" \ # reconfigure # idf.py -B build_bd build flash monitor # -# When this overlay wins, main/CMakeLists.txt links ble_uart_bluedroid.c -# instead of ble_uart_nimble.c. The public ble_uart.h API is identical +# When this overlay wins, the ble_uart component compiles +# ble_uart_bluedroid.c instead of ble_uart_nimble.c (each backend is +# gated on CONFIG_BT_*_ENABLED). The public ble_uart.h API is identical # either way. CONFIG_BT_ENABLED=y diff --git a/examples/bluetooth/common/ble_uart/CMakeLists.txt b/examples/bluetooth/common/ble_uart/CMakeLists.txt new file mode 100644 index 00000000000..e1c873c2d8b --- /dev/null +++ b/examples/bluetooth/common/ble_uart/CMakeLists.txt @@ -0,0 +1,9 @@ +# Both backends are listed; each .c file body is wrapped in +# #if CONFIG_BT_NIMBLE_ENABLED / #if CONFIG_BT_BLUEDROID_ENABLED so only +# the matching backend produces code. This is the standard IDF +# pattern for conditional sources, because sdkconfig isn't loaded +# during the early CMake component-requirement scan. +idf_component_register(SRCS "ble_uart_nimble.c" + "ble_uart_bluedroid.c" + INCLUDE_DIRS "." + REQUIRES bt nvs_flash) diff --git a/examples/bluetooth/ble_uart_service/main/Kconfig.projbuild b/examples/bluetooth/common/ble_uart/Kconfig similarity index 75% rename from examples/bluetooth/ble_uart_service/main/Kconfig.projbuild rename to examples/bluetooth/common/ble_uart/Kconfig index 0f3654d8305..433d629fcc9 100644 --- a/examples/bluetooth/ble_uart_service/main/Kconfig.projbuild +++ b/examples/bluetooth/common/ble_uart/Kconfig @@ -1,11 +1,13 @@ -menu "BLE UART Example" +menu "BLE UART library" config BLE_UART_DEVICE_NAME_PREFIX string "BLE device name prefix" default "BleUart" help - The firmware advertises as `-XXXX` where XXXX is - the last two bytes of the BT MAC in hex. + Default prefix for examples that advertise as `-XXXX` + where XXXX is the last two bytes of the BT MAC in hex. + Application code may ignore this and set an explicit name in + ble_uart_config_t. config BLE_UART_RX_SCRATCH_SIZE int "RX scratch buffer size (bytes)" diff --git a/examples/bluetooth/ble_uart_service/PORTING.md b/examples/bluetooth/common/ble_uart/PORTING.md similarity index 75% rename from examples/bluetooth/ble_uart_service/PORTING.md rename to examples/bluetooth/common/ble_uart/PORTING.md index 47e3859c58f..1d3cbe8a9c2 100644 --- a/examples/bluetooth/ble_uart_service/PORTING.md +++ b/examples/bluetooth/common/ble_uart/PORTING.md @@ -1,7 +1,20 @@ # BLE UART Porting & API Guide +This document lives in **`examples/bluetooth/common/ble_uart/`** next to the +`ble_uart` component sources (`ble_uart.h`, backend `.c` files). + +**Reference application:** use the **`examples/bluetooth/ble_uart_service`** +example as the working template. Its root `CMakeLists.txt` appends this +directory to **`EXTRA_COMPONENT_DIRS`** so `main` can `REQUIRES ble_uart`; +`main/main.c` initializes NVS and a MAC-derived GAP name, calls +`ble_uart_install()` / `ble_uart_open()` with the default encrypted UART-over-BLE echo +path, and the tree ships `sdkconfig.defaults` plus the Bluedroid overlay +(`sdkconfig.bluedroid`). Clone or diff that project when adapting to a new +target or host stack. + A complete guide to integrating `ble_uart` into any ESP-IDF project. -**Two or three files plus 5 steps of glue code** are enough to bring an +**Either** `EXTRA_COMPONENT_DIRS` pointing at this component **or** a few +copied source files **plus** the glue steps below are enough to bring an encrypted BLE serial peripheral up in a fresh project — the same `ble_uart.h` API works on top of either NimBLE or Bluedroid; pick the host with a Kconfig knob. @@ -18,7 +31,7 @@ flagged inline. | Capability | Description | | --- | --- | -| Standard Nordic UART Service GATT (RX/TX) | Interoperates with every generic BLE-serial tool (nRF Connect, Web Bluetooth, custom scripts) | +| Widely used BLE UART-over-GATT (RX/TX) | Interoperates with every generic BLE-serial tool (mobile GATT clients, Web Bluetooth, custom scripts) | | LE Secure Connections + Bonding pairing | Single switch; when enabled, a fresh 6-digit passkey is printed to UART | | Auto-reconnect | After a bonded central disconnects, advertising restarts immediately and the LTK is reused — no passkey prompt | | Raw byte pass-through | RX is delivered via a callback; TX is exposed as `ble_uart_tx` | @@ -44,26 +57,45 @@ is entirely up to you**. ## 3. File Inventory -Files to copy into the target project — pick the backend you want and -copy that pair plus the public header: +Canonical sources live under **`$IDF_PATH/examples/bluetooth/common/ble_uart/`** +(component name `ble_uart`): `ble_uart.h`, `ble_uart_nimble.c`, +`ble_uart_bluedroid.c`, `CMakeLists.txt`, and `Kconfig` (prefix + RX scratch; +`menuconfig → Component configuration → BLE UART library`). When reusing +outside this tree, copy the whole `common/ble_uart/` directory or at least +merge `Kconfig` into your component so the same `CONFIG_BLE_UART_*` symbols +exist. + +**Option A — depend on the in-tree component (no copy):** add the component +directory to **`EXTRA_COMPONENT_DIRS` in the project root `CMakeLists.txt` +before `include($ENV{IDF_PATH}/tools/cmake/project.cmake)` / `project()`**, +then use `REQUIRES ble_uart` from `main/CMakeLists.txt` (see +`examples/bluetooth/ble_uart_service/CMakeLists.txt`). This ensures the +`ble_uart` target exists when CMake expands `main`'s requirements. + +Kconfig options appear under +`menuconfig → Component configuration → BLE UART library`. + +> A `main/idf_component.yml` path dependency alone is **not** sufficient if +> `main/CMakeLists.txt` lists `REQUIRES ble_uart`: the early requirement scan +> runs before the component manager injects that dependency, so CMake fails +> with *unknown component `ble_uart`*. Prefer `EXTRA_COMPONENT_DIRS` (as in the +> reference example) or copy the sources into a normal project component. + +**Option B — copy into your project:** pick the backend you want and +copy that pair plus the public header (or copy both backends; each `.c` +gates on its Kconfig symbol): ``` your_project/main/ -├── ble_uart.h ← copy this (stack-agnostic public API, ~260 lines) -├── ble_uart_nimble.c ← if you'll set CONFIG_BT_NIMBLE_ENABLED=y (~670 lines) -└── ble_uart_bluedroid.c ← if you'll set CONFIG_BT_BLUEDROID_ENABLED=y (~900 lines) +├── ble_uart.h ← copy from .../common/ble_uart/ +├── ble_uart_nimble.c ← if you'll set CONFIG_BT_NIMBLE_ENABLED=y +└── ble_uart_bluedroid.c ← if you'll set CONFIG_BT_BLUEDROID_ENABLED=y ``` -You can also copy *both* `ble_uart_nimble.c` and `ble_uart_bluedroid.c` -unchanged — each `.c` file gates its body on the matching Kconfig -symbol, so the inactive one compiles to nothing. This is what the -example itself does, and it lets you flip stacks without changing the -source list. - -Optional: `Kconfig.projbuild` defines `BLE_UART_DEVICE_NAME_PREFIX` -and `BLE_UART_RX_SCRATCH_SIZE`. Copy it too if you want either to be -tunable from `menuconfig`; otherwise hard-code the name in your -source and rely on the 1024-byte fallback for RX scratch. +Optional: copy `Kconfig` from `common/ble_uart/` into your component (or merge +its symbols into your own `Kconfig`) if you want `BLE_UART_*` in `menuconfig`; +otherwise hard-code the device name and rely on the 1024-byte fallback for RX +scratch. --- @@ -75,11 +107,12 @@ Assume you already have an ESP-IDF project (`my_project/`). ```bash cd my_project/main +BLE_UART_SRC="$IDF_PATH/examples/bluetooth/common/ble_uart" # Stack-agnostic public header — always. -cp /path/to/ble_uart_service/main/ble_uart.h . +cp "$BLE_UART_SRC/ble_uart.h" . # Pick one (or copy both — the inactive one compiles to nothing). -cp /path/to/ble_uart_service/main/ble_uart_nimble.c . -cp /path/to/ble_uart_service/main/ble_uart_bluedroid.c . +cp "$BLE_UART_SRC/ble_uart_nimble.c" . +cp "$BLE_UART_SRC/ble_uart_bluedroid.c" . ``` ### 4.2 Edit `main/CMakeLists.txt` @@ -116,6 +149,22 @@ the central must support it. **Bluedroid backend (drop-in alternative):** +Use the **`examples/bluetooth/ble_uart_service/sdkconfig.bluedroid`** file as +the authoritative Kconfig overlay: it enables the host stack, SMP, GATTS +(service-table API), and the BLE-only advertising knobs that +`ble_uart_bluedroid.c` expects. Either merge those lines into your own +`sdkconfig.defaults`, or pass them as a second defaults file: + +```bash +idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.bluedroid" reconfigure +``` + +(Paths are relative to the example project root; copy `sdkconfig.bluedroid` +into your tree if you are not starting from `ble_uart_service`.) + +A minimal inline sketch (may drift from IDF defaults — **diff against +`sdkconfig.bluedroid` after each IDF upgrade**): + ```ini CONFIG_BT_ENABLED=y CONFIG_BT_NIMBLE_ENABLED=n @@ -124,8 +173,8 @@ CONFIG_BT_BLUEDROID_ENABLED=y # LE Secure Connections + bonding (Bluedroid persists LTKs by default) CONFIG_BT_BLE_SMP_ENABLE=y -# Optional: bigger MTU -CONFIG_BT_GATT_MAX_MTU_SIZE=512 +# Optional: bigger MTU (when supported by your IDF target / menuconfig) +# CONFIG_BT_GATT_MAX_MTU_SIZE=512 # BLE-only feature set (saves flash on classic-BT-capable parts) CONFIG_BT_BLE_42_FEATURES_SUPPORTED=y @@ -201,7 +250,7 @@ I (xxx) ble_uart: registered service svc_handle=40 rx=42 tx=44 cccd=45 I (xxx) ble_uart: advertising started ``` -nRF Connect on a phone discovers `MyDevice`; connect, enter the +A phone GATT client app discovers `MyDevice`; connect, enter the passkey, subscribe to TX, write to RX, and you will see the echo come back. @@ -337,7 +386,7 @@ returns `ENOTCONN` to tell you. extern const ble_uart_uuid128_t ble_uart_service_uuid; ``` -Always `6e400001-b5a3-f393-e0a9-e50e24dcca9e` (the NUS standard). It is +Always `6e400001-b5a3-f393-e0a9-e50e24dcca9e` (the de-facto BLE UART service UUID). It is already inserted into the scan response, so the **application normally does not touch it**. You only need it if you take over advertising yourself (see 6.3). @@ -403,7 +452,7 @@ Effect: - GATT characteristics drop the `_ENC | _AUTHEN` flags. - Any central can read/write — no pairing required. - No passkey prompt. -- Data is sniffable by any nearby nRF dongle. +- Data is sniffable by any nearby BLE sniffer or compromised radio in range. **Do not ship this in production firmware.** @@ -439,7 +488,10 @@ ble_uart_open(); ### 6.4 Configuring the device-name prefix via Kconfig -Copy `Kconfig.projbuild` into `main/`, then: +If you use the shared `ble_uart` component, options are already in +`menuconfig → Component configuration → BLE UART library`. If you copied only +the `.c` / `.h` files into `main/`, copy `Kconfig` from `common/ble_uart/` as +well (or merge its symbols into your own `Kconfig.projbuild`), then: ```c char name[24]; @@ -453,8 +505,8 @@ ble_uart_install(&(ble_uart_config_t){ }); ``` -Edit the default through `menuconfig → BLE UART Example → BLE device -name prefix`. +Edit the default through `menuconfig → Component configuration → BLE UART +library → BLE device name prefix`. ### 6.5 Pushing data proactively @@ -538,16 +590,17 @@ If you **build directly on top of this example**: | --- | --- | | `main.c` echo template | Replace with your own `on_rx` body | | `sdkconfig.defaults` | Reuse as-is | -| `Kconfig.projbuild` | Reuse as-is | +| `sdkconfig.bluedroid` | Only if you switch to Bluedroid host — reuse as-is (see §4.3); omit for default NimBLE | +| Root `CMakeLists.txt` (`EXTRA_COMPONENT_DIRS` → `../common/ble_uart`) | Reuse as-is (or follow §3 option B) | | `CMakeLists.txt` (root + main) | Reuse as-is | If you **start from an empty project**: | What you need to do | Source | | --- | --- | -| Copy `ble_uart.h` + at least one of `ble_uart_nimble.c` / `ble_uart_bluedroid.c` into `main/` | This example | +| Add `EXTRA_COMPONENT_DIRS` for `examples/bluetooth/common/ble_uart` in root `CMakeLists.txt`, **or** copy `ble_uart.h` + at least one of `ble_uart_nimble.c` / `ble_uart_bluedroid.c` into `main/` | §3 of this guide | | Copy the key lines of `sdkconfig.defaults` | §4.3 of this guide | -| Add SRC + REQUIRES to `main/CMakeLists.txt` | §4.2 of this guide | +| Add `REQUIRES ble_uart nvs_flash` (after `EXTRA_COMPONENT_DIRS`) **or** SRC + `REQUIRES bt nvs_flash` (copied sources) to `main/CMakeLists.txt` | §4.2 of this guide | | Write `install` + `open` in `app_main` | §4.4 of this guide | --- @@ -591,8 +644,21 @@ extern const ble_uart_uuid128_t ble_uart_service_uuid; ## 12. Minimal Project Template (ready to flash) -A complete flashable project takes 7 files (the inactive backend `.c` -compiles to nothing, so it costs you nothing to ship both): +A complete flashable project takes a handful of files. The inactive +backend `.c` compiles to nothing if you ship both. + +**Using the shared component (fewer copies):** + +``` +my_ble_uart_project/ +├── CMakeLists.txt ← EXTRA_COMPONENT_DIRS → …/common/ble_uart (before project()) +├── sdkconfig.defaults +└── main/ + ├── CMakeLists.txt ← REQUIRES ble_uart nvs_flash; SRCS main.c only + └── main.c +``` + +**Copying sources into `main/` (classic layout):** ``` my_ble_uart_project/ @@ -600,20 +666,28 @@ my_ble_uart_project/ ├── sdkconfig.defaults └── main/ ├── CMakeLists.txt - ├── ble_uart.h ← copied from this example - ├── ble_uart_nimble.c ← copied from this example - ├── ble_uart_bluedroid.c ← copied from this example (optional) + ├── ble_uart.h ← from $IDF_PATH/examples/bluetooth/common/ble_uart/ + ├── ble_uart_nimble.c + ├── ble_uart_bluedroid.c ← optional second backend └── main.c ``` -**Root `CMakeLists.txt`**: +**Root `CMakeLists.txt`** (shared `ble_uart` via `EXTRA_COMPONENT_DIRS`): ```cmake cmake_minimum_required(VERSION 3.16) +list(APPEND EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/../path/to/common/ble_uart") include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(my_ble_uart) ``` -**`main/CMakeLists.txt`**: +**`main/CMakeLists.txt`** (shared component — no `.c` copies in `main/`): +```cmake +idf_component_register(SRCS "main.c" + INCLUDE_DIRS "." + REQUIRES ble_uart nvs_flash) +``` + +**`main/CMakeLists.txt`** (classic copy layout — both backends in `main/`): ```cmake idf_component_register(SRCS "main.c" "ble_uart_nimble.c" @@ -633,6 +707,11 @@ CONFIG_BT_NIMBLE_NVS_PERSIST=y CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=512 ``` +**Bluedroid host instead of NimBLE:** copy +`examples/bluetooth/ble_uart_service/sdkconfig.bluedroid` next to your +`sdkconfig.defaults` and pass +`-D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.bluedroid"` (see §4.3). + **`main/main.c`** — copy the §4.4 template verbatim. Flash: diff --git a/examples/bluetooth/ble_uart_service/main/ble_uart.h b/examples/bluetooth/common/ble_uart/ble_uart.h similarity index 92% rename from examples/bluetooth/ble_uart_service/main/ble_uart.h rename to examples/bluetooth/common/ble_uart/ble_uart.h index 037b48390d7..6388252e1aa 100644 --- a/examples/bluetooth/ble_uart_service/main/ble_uart.h +++ b/examples/bluetooth/common/ble_uart/ble_uart.h @@ -5,8 +5,8 @@ * * BLE UART — turnkey serial-over-BLE peripheral. * - * Implements the de-facto Nordic UART Service (NUS) GATT layout - * (RX write, TX notify) on top of either NimBLE or Bluedroid; the + * Implements the de-facto BLE UART-over-GATT layout (RX write, TX notify; + * fixed 128-bit UUIDs below) on top of either NimBLE or Bluedroid; the * backend is picked at compile time via CONFIG_BT_NIMBLE_ENABLED / * CONFIG_BT_BLUEDROID_ENABLED. * @@ -21,13 +21,13 @@ * Run-forever apps only need install + open. close / uninstall is * for apps that need to power BLE off at runtime. * - * GATT layout (UUIDs fixed by the NUS spec): + * GATT layout (UUIDs are the widely used fixed 128-bit values): * * Service: 6e400001-b5a3-f393-e0a9-e50e24dcca9e * RX : 6e400002-b5a3-f393-e0a9-e50e24dcca9e write * TX : 6e400003-b5a3-f393-e0a9-e50e24dcca9e notify * - * See PORTING.md for the integration guide. + * See PORTING.md in this component directory for the integration guide. */ #pragma once @@ -89,7 +89,7 @@ typedef struct { /* ----- Lifecycle ------------------------------------------------------ */ -/** Bring up host stack + Security Manager + SIG services + NUS GATT +/** Bring up host stack + Security Manager + SIG services + BLE UART GATT * service. Caller must have already called nvs_flash_init(). * cfg->device_name is copied; doesn't need to outlive the call. * Single-shot until ble_uart_uninstall(); a second call returns @@ -145,7 +145,7 @@ bool ble_uart_is_subscribed(void); /* ----- Service UUID -------------------------------------------------- */ -/** The NUS service UUID, exposed for custom advertising payloads. +/** The BLE UART service UUID, exposed for custom advertising payloads. * The two characteristic UUIDs are private to the backend. */ extern const ble_uart_uuid128_t ble_uart_service_uuid; diff --git a/examples/bluetooth/ble_uart_service/main/ble_uart_bluedroid.c b/examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c similarity index 99% rename from examples/bluetooth/ble_uart_service/main/ble_uart_bluedroid.c rename to examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c index 6f93ce057d2..26b41ac585a 100644 --- a/examples/bluetooth/ble_uart_service/main/ble_uart_bluedroid.c +++ b/examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c @@ -204,7 +204,7 @@ static void build_attr_table(bool encrypted) }, }; - /* [TX value] — NUS spec is notify-only, so the prop above doesn't + /* [TX value] — TX characteristic is notify-only, so the prop above doesn't * advertise READ; perm only matters if a client tries READ anyway. */ s_nus_db[NUS_IDX_TX_VAL] = (esp_gatts_attr_db_t){ .attr_control = {ESP_GATT_AUTO_RSP}, @@ -251,7 +251,7 @@ static esp_ble_adv_data_t s_adv_data = { .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), }; -/* Scan response = NUS UUID. Splitting it off the primary payload +/* Scan response = 128-bit UART service UUID. Splitting it off the primary payload * leaves room for name + tx_pwr in the 31-byte primary. */ static esp_ble_adv_data_t s_scan_rsp_data = { .set_scan_rsp = true, diff --git a/examples/bluetooth/ble_uart_service/main/ble_uart_nimble.c b/examples/bluetooth/common/ble_uart/ble_uart_nimble.c similarity index 98% rename from examples/bluetooth/ble_uart_service/main/ble_uart_nimble.c rename to examples/bluetooth/common/ble_uart/ble_uart_nimble.c index bce4ab66f93..c59698f09a2 100644 --- a/examples/bluetooth/ble_uart_service/main/ble_uart_nimble.c +++ b/examples/bluetooth/common/ble_uart/ble_uart_nimble.c @@ -64,7 +64,7 @@ extern void ble_store_config_init(void); /* ===== UUIDs =========================================================== */ -/* NUS UUIDs in little-endian byte order. */ +/* BLE UART profile UUIDs in little-endian byte order. */ #define NUS_SVC_BYTES 0x9e, 0xca, 0xdc, 0x24, 0x0e, 0xe5, 0xa9, 0xe0, \ 0x93, 0xf3, 0xa3, 0xb5, 0x01, 0x00, 0x40, 0x6e #define NUS_RX_BYTES 0x9e, 0xca, 0xdc, 0x24, 0x0e, 0xe5, 0xa9, 0xe0, \ @@ -80,8 +80,9 @@ static const ble_uuid128_t s_chr_tx_uuid = BLE_UUID128_INIT(NUS_TX_BYTES); /* ===== State =========================================================== */ -/* RX scratch capacity. Tunable via menuconfig; fall back to 1024 if - * Kconfig.projbuild isn't carried along when reusing this file. */ +/* RX scratch capacity. Tunable via menuconfig (Component config → BLE UART + * library); fall + * back to 1024 if CONFIG_BLE_UART_RX_SCRATCH_SIZE is absent. */ #ifndef CONFIG_BLE_UART_RX_SCRATCH_SIZE #define CONFIG_BLE_UART_RX_SCRATCH_SIZE 1024 #endif @@ -106,7 +107,7 @@ static uint8_t s_own_addr_type; static int gap_event(struct ble_gap_event *event, void *arg); static int start_advertising(void); -/* ===== GATT (NUS) ====================================================== */ +/* ===== GATT (BLE UART service) ========================================= */ static int chr_access(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) @@ -253,7 +254,7 @@ static int start_advertising(void) { /* 31-byte primary adv can't hold flags + tx_pwr + name + 128-bit * UUID together, so split: primary = flags+tx_pwr+name, - * scan rsp = NUS UUID. */ + * scan rsp = 128-bit service UUID. */ const char *name = s_dev_name; size_t name_len = strlen(name); @@ -262,7 +263,7 @@ static int start_advertising(void) .tx_pwr_lvl_is_present = 1, .tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO, /* If no name was set, advertise without one (NimBLE accepts - * NULL+0); the NUS UUID in scan rsp still identifies us. */ + * NULL+0); the service UUID in scan rsp still identifies us. */ .name = name_len > 0 ? (uint8_t *)name : NULL, .name_len = name_len, .name_is_complete = name_len > 0 ? 1 : 0, diff --git a/tools/ble/ble_uart_bridge/README.md b/tools/ble/ble_uart_bridge/README.md index 04af1fb38ce..d4a514b1693 100644 --- a/tools/ble/ble_uart_bridge/README.md +++ b/tools/ble/ble_uart_bridge/README.md @@ -62,7 +62,7 @@ Open an interactive BLE UART Console: python main.py console DEVICE_ID ``` -For Console options such as line endings, hex mode, and write-with-response, see [Quick-Start-BLE-UART-Console.md](docs/Quick-Start-BLE-UART-Console.md). If you need firmware to test against, use the [BLE UART Service example](../../../examples/bluetooth/ble_uart_service) as an Echo Server: it advertises the default Nordic UART Service profile and echoes RX writes back through TX notifications. +For Console options such as line endings, hex mode, and write-with-response, see [Quick-Start-BLE-UART-Console.md](docs/Quick-Start-BLE-UART-Console.md). If you need firmware to test against, use the [BLE UART Service example](../../../examples/bluetooth/ble_uart_service) as an Echo Server: it advertises the default BLE UART-over-GATT UUIDs and echoes RX writes back through TX notifications. Run the BLE UART Daemon: @@ -194,7 +194,7 @@ Main responsibilities: - Connect and disconnect with a BLE UART GATT profile. - Subscribe to device-to-host notifications. - Send host-to-device data as `str`, `bytes`, or `bytearray`. -- Support a default NUS profile and user-defined BLE UART profiles. +- Support a default BLE-UART UUID profile and user-defined BLE UART profiles. Important APIs: @@ -262,7 +262,7 @@ Use Core when your business logic lives in Python. Use Console when you only nee ## Profile compatibility -The default profile is compatible with the Nordic UART Service (NUS): +The default profile uses the widely deployed BLE UART-over-GATT UUID set: - Service UUID: `6E400001-B5A3-F393-E0A9-E50E24DCCA9E` - RX characteristic UUID, host to device: `6E400002-B5A3-F393-E0A9-E50E24DCCA9E` diff --git a/tools/ble/ble_uart_bridge/demos/opencode/README.md b/tools/ble/ble_uart_bridge/demos/opencode/README.md index caf758a1b96..92347e448a4 100644 --- a/tools/ble/ble_uart_bridge/demos/opencode/README.md +++ b/tools/ble/ble_uart_bridge/demos/opencode/README.md @@ -42,7 +42,7 @@ flowchart LR OC -->|permission.asked| Plugin Plugin -->|POST /notify| Daemon[ble_uart_bridge daemon] Plugin -->|POST /request| Daemon - Daemon -->|BLE NUS JSONL| Device[BLE device UI] + Daemon -->|BLE UART JSONL| Device[BLE device UI] Device -->|once / reject| Daemon Daemon -->|HTTP response| Plugin Plugin -->|SDK permission reply| OC @@ -54,7 +54,7 @@ flowchart LR The intended firmware companion is an `esp-vocat` example for the MiaoBan (喵伴) device, planned for the `esp-iot-solution` repository. Until that - example is available, use any device that implements Nordic UART Service and + example is available, use any device that implements the default BLE UART-over-GATT UUIDs and the JSONL request/response envelope described in [Firmware protocol reference](#firmware-protocol-reference). @@ -235,7 +235,7 @@ permission requests can be approved once with `once` or denied with `reject`. - The BLE daemon endpoint is configured by `OPENCODE_BLE_DAEMON_URL`, defaulting to `http://127.0.0.1:8888`. - The BLE daemon supports both `POST /notify` and `POST /request`. -- The BLE device implements Nordic UART Service. +- The BLE device implements the default BLE UART-over-GATT UUID layout. - The BLE device understands JSON messages described in [Firmware protocol reference](#firmware-protocol-reference). - Permission decisions from the current single-key device are: `once`, `reject`. diff --git a/tools/ble/ble_uart_bridge/docs/PORTING.md b/tools/ble/ble_uart_bridge/docs/PORTING.md index f3f468c690c..070f77f86c0 100644 --- a/tools/ble/ble_uart_bridge/docs/PORTING.md +++ b/tools/ble/ble_uart_bridge/docs/PORTING.md @@ -141,7 +141,7 @@ await bridge.send(b"\x01\x02", with_response=True) ## Use a custom BLE UART profile -The default profile uses Nordic UART Service UUIDs. For custom firmware, create a `BLEUARTProfile`: +The default profile uses the de-facto BLE UART-over-GATT UUIDs. For custom firmware, create a `BLEUARTProfile`: ```python from src.core import BLEUARTBridge diff --git a/tools/ble/ble_uart_bridge/docs/Profile-Compatibility.md b/tools/ble/ble_uart_bridge/docs/Profile-Compatibility.md index 799c979e7fe..fc88264786b 100644 --- a/tools/ble/ble_uart_bridge/docs/Profile-Compatibility.md +++ b/tools/ble/ble_uart_bridge/docs/Profile-Compatibility.md @@ -8,9 +8,9 @@ BLE UART Bridge works with BLE GATT profiles that provide a UART-like data path: - one characteristic that the host writes to - one characteristic that the device uses to notify data back to the host -The default profile is compatible with the Nordic UART Service (NUS), but NUS is not the only possible BLE UART-style profile. +The default profile matches the widely used BLE UART-over-GATT UUID set (service `6E400001-…`, RX/TX characteristics), but that layout is not the only possible BLE UART-style profile. -## Default NUS-compatible profile +## Default BLE-UART-compatible profile The built-in default profile uses these UUIDs: @@ -20,7 +20,7 @@ The built-in default profile uses these UUIDs: | RX, host to device | `6E400002-B5A3-F393-E0A9-E50E24DCCA9E` | | TX, device to host | `6E400003-B5A3-F393-E0A9-E50E24DCCA9E` | -Use the default profile when the device advertises a NUS-compatible service. +Use the default profile when the device advertises a service using those UUIDs. ## ESP-IDF BLE SPP examples @@ -31,7 +31,7 @@ ESP-IDF includes BLE SPP examples that implement Espressif BLE UART-like vendor- - `examples/bluetooth/bluedroid/ble/ble_spp_server` - `examples/bluetooth/bluedroid/ble/ble_spp_client` -BLE SPP over BLE is not a Bluetooth SIG standard profile. It is a vendor-specific GATT design that emulates a serial link, similar in purpose to NUS. +BLE SPP over BLE is not a Bluetooth SIG standard profile. It is a vendor-specific GATT design that emulates a serial link, similar in purpose to the default BLE UART layout above. ESP-IDF BLE SPP examples may define more characteristics than BLE UART Bridge needs, such as data, command, and status characteristics. To use BLE UART Bridge with such a profile, map only the UART-like data path into `BLEUARTProfile`. diff --git a/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md b/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md index 0f18279a1b5..5570ff2195d 100644 --- a/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md +++ b/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md @@ -21,7 +21,7 @@ The Console is useful when you want to type data into a BLE UART device and insp On Windows, run `export.bat` or `export.ps1` from the ESP-IDF root directory before installing `requirements.txt`. If you use your own Python virtual environment instead, activate it before installing `requirements.txt`. -3. A BLE device advertising the BLE UART service. By default the tool scans for Nordic UART Service UUIDs. For a known-compatible test target, build and flash the [BLE UART Service example](../../../../examples/bluetooth/ble_uart_service), which acts as an Echo Server by echoing RX writes back through TX notifications. +3. A BLE device advertising the BLE UART service. By default the tool scans for the de-facto BLE UART-over-GATT UUIDs (`6E400001-…` / `…02` / `…03`). For a known-compatible test target, build and flash the [BLE UART Service example](../../../../examples/bluetooth/ble_uart_service), which acts as an Echo Server by echoing RX writes back through TX notifications. ## Find a device From 4bc65ebd82ec9d2b8463d0ddca46aafd53a66bd0 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Mon, 8 Jun 2026 14:14:41 +0800 Subject: [PATCH 2/3] docs(ble): add ESP-BLE-UART companion guide Move the OpenCode companion guide into the ble_uart_service example. Add English and Chinese Markdown guides with image assets. Keep ESP-BLE-UART naming consistent across the example and bridge tooling. (cherry picked from commit 926111e721b714fa36a979b8b3fdf8aa77fc11f4) Co-authored-by: Zhou Xiao --- .../ble_uart_service/OPENCODE_COMPANION.md | 470 +++++++++++++++++ .../ble_uart_service/OPENCODE_COMPANION_CN.md | 472 ++++++++++++++++++ examples/bluetooth/ble_uart_service/README.md | 16 +- .../ESP-VoCat-Asking-For-Permission.png | Bin 0 -> 322588 bytes .../ESP-VoCat-Working-With-OpenCode.png | Bin 0 -> 312302 bytes .../bluetooth/ble_uart_service/main/main.c | 2 +- examples/bluetooth/common/ble_uart/Kconfig | 2 +- examples/bluetooth/common/ble_uart/PORTING.md | 14 +- examples/bluetooth/common/ble_uart/ble_uart.h | 4 +- .../common/ble_uart/ble_uart_bluedroid.c | 2 +- .../common/ble_uart/ble_uart_nimble.c | 4 +- tools/ble/ble_uart_bridge/README.md | 24 +- .../ble_uart_bridge/demos/opencode/README.md | 48 +- .../demos/opencode/src/ble-daemon-client.ts | 16 +- .../demos/opencode/src/config.ts | 2 +- .../opencode/src/opencode-ble-uart-bridge.ts | 18 +- .../opencode/src/opencode-permission-reply.ts | 2 +- .../demos/opencode/src/permission-payload.ts | 8 +- .../demos/opencode/src/permission-queue.ts | 2 +- .../demos/opencode/src/types.ts | 8 +- tools/ble/ble_uart_bridge/docs/PORTING.md | 6 +- .../docs/Profile-Compatibility.md | 16 +- .../docs/Quick-Start-BLE-UART-Console.md | 14 +- .../docs/Quick-Start-BLE-UART-Daemon.md | 6 +- tools/ble/ble_uart_bridge/src/console/api.py | 2 +- .../ble_uart_bridge/src/console/console.py | 6 +- tools/ble/ble_uart_bridge/src/core/api.py | 2 +- tools/ble/ble_uart_bridge/src/core/errors.py | 6 +- tools/ble/ble_uart_bridge/src/daemon/api.py | 4 +- .../ble/ble_uart_bridge/src/daemon/server.py | 8 +- 30 files changed, 1072 insertions(+), 112 deletions(-) create mode 100644 examples/bluetooth/ble_uart_service/OPENCODE_COMPANION.md create mode 100644 examples/bluetooth/ble_uart_service/OPENCODE_COMPANION_CN.md create mode 100644 examples/bluetooth/ble_uart_service/assets/ESP-VoCat-Asking-For-Permission.png create mode 100644 examples/bluetooth/ble_uart_service/assets/ESP-VoCat-Working-With-OpenCode.png diff --git a/examples/bluetooth/ble_uart_service/OPENCODE_COMPANION.md b/examples/bluetooth/ble_uart_service/OPENCODE_COMPANION.md new file mode 100644 index 00000000000..7b39e318619 --- /dev/null +++ b/examples/bluetooth/ble_uart_service/OPENCODE_COMPANION.md @@ -0,0 +1,470 @@ + + + +# Building an OpenCode Companion with ESP-BLE-UART and ESP-VoCat + +## Introduction + +This document describes how to build a physical companion device for OpenCode using ESP-BLE-UART and ESP-VoCat. The companion device reflects the current session state on a display, presents permission requests for user approval, and returns permission decisions to OpenCode via single-key input. BLE UART serves as the transport layer between the device and the host-side editor session. + +The tutorial is organized in two parts. Part 1 uses **ESP-BLE-UART Console** with the `ble_uart_service` Echo Server (this example) to verify that the host can discover, connect to, and exchange data with a BLE UART device. Part 2 introduces the `ble_uart_service` example firmware for the ESP-VoCat board (maintained in [esp-iot-solution](https://github.com/espressif/esp-iot-solution)), the **ESP-BLE-UART Daemon**, and the **OpenCode Plugin**, which together enable the device to receive session status updates and return `once` / `reject` permission decisions to OpenCode. + +

+ ESP-VoCat Working With OpenCode +
ESP-VoCat Working With OpenCode +

+ +## Learning Objectives + +- Understand the BLE UART service and its GATT convention +- Learn how to build and flash the ESP-BLE-UART Echo Server +- Understand the JSON Lines protocol used over BLE UART +- Learn how to configure the ESP-BLE-UART Daemon and OpenCode Plugin + +## Prerequisites + +- A host machine with a Bluetooth adapter and scan/connect permissions. +- ESP-IDF environment exported. +- Any target supported by `ble_uart_service` for the Console echo-server smoke test. +- The full OpenCode UI demo requires: + - An [ESP-VoCat](https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s3/esp-vocat/index.html) development board (based on ESP32-S3) with a circular touch display and single-key input. The BLE UART transport is reusable, but the display/touch/emote UI in this example is board-specific. The example is maintained in the [esp-iot-solution](https://github.com/espressif/esp-iot-solution) repository at `examples/bluetooth/ble_uart_service`; see its README for supported boards, dependency versions, and build instructions. + - The first CMake configuration of the `ble_uart_service` example requires network access to download `emote_assets.bin`. For offline or intranet environments, set `EMOTE_ASSETS_BIN` to a local path to override the download. + - OpenCode installed to run the plugin demo. + +Install the host-side ESP-BLE-UART Bridge dependencies: + +```bash +cd $IDF_PATH +. ./export.sh +python -m pip install -r tools/ble/ble_uart_bridge/requirements.txt +``` + +On Windows, use `export.bat` or `export.ps1` from the ESP-IDF root instead of `. ./export.sh`. + +## Part 1: ESP-BLE-UART Console + +### What BLE UART Is + +Bluetooth LE does not have a real UART peripheral in the classic serial-port sense. A BLE UART service is a GATT convention: one characteristic serves as the host-to-device RX channel, another as the device-to-host TX channel. The Echo Server in `ble_uart_service` uses Nordic UART Service-style UUIDs and sends received bytes back through TX notifications, which makes it suitable for verifying the host-side Console path. + +The transport layer only moves bytes. In Part 1, those bytes are simple echoed text. In Part 2, the `ble_uart_service` example firmware running on ESP-VoCat puts a JSONL protocol on top of the same BLE UART channel. + +### Build and Flash the ESP-BLE-UART Echo Server + +```bash +cd $IDF_PATH/examples/bluetooth/ble_uart_service +idf.py set-target esp32s3 # or another supported target +idf.py build flash monitor +``` + +Keep the monitor open during pairing. If the central asks for a passkey, use the six-digit value printed by the firmware log. The firmware console output should resemble the following log (the address and device name suffix will vary): + +``` +I (548) ble_uart: BLE host task started +I (548) ble_uart: registered service 0x1800 handle=1 +I (548) ble_uart: registered chr 0x2a00 def=2 val=3 +I (548) ble_uart: registered chr 0x2a01 def=4 val=5 +I (558) ble_uart: registered service 0x1801 handle=6 +I (558) ble_uart: registered chr 0x2a05 def=7 val=8 +I (568) ble_uart: registered chr 0x2b3a def=10 val=11 +I (568) ble_uart: registered chr 0x2b29 def=12 val=13 +I (578) ble_uart: registered service 6e400001-b5a3-f393-e0a9-e50e24dcca9e handle=14 +I (578) ble_uart: registered chr 6e400002-b5a3-f393-e0a9-e50e24dcca9e def=15 val=16 +I (588) ble_uart: registered chr 6e400003-b5a3-f393-e0a9-e50e24dcca9e def=17 val=18 +I (608) NimBLE: GAP procedure initiated: stop advertising. +I (608) NimBLE: GAP procedure initiated: stop advertising. +I (608) ble_uart: addr=74:4d:bd:a9:ed:72 +I (608) NimBLE: GAP procedure initiated: advertise; +I (618) NimBLE: disc_mode=2 +I (618) NimBLE: adv_channel_map=0 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=0 adv_itvl_max=0 +I (628) NimBLE: +I (628) ble_uart: advertising as 'BleUart-ED72' +I (628) main_task: Returned from app_main() +``` + +The `ble_uart: addr=74:4d:bd:a9:ed:72` line shows the device Bluetooth MAC address (`74:4D:BD:A9:ED:72`). The device advertises under the name shown in the last `ble_uart: advertising as 'BleUart-XXXX'` line. + +When the central initiates a connection, the firmware logs a pairing passkey prompt. If you are prompted for a passkey by the system Bluetooth dialog or the `connection-check` command, enter the six-digit number shown in the monitor: + +``` +W (19298) ble_uart: +-----------------------------+ +W (19298) ble_uart: | BLE PAIRING PASSKEY: | +W (19298) ble_uart: | 617138 | +W (19298) ble_uart: +-----------------------------+ +``` + +### Find the BLE UART Device + +Open a second terminal: + +```bash +cd $IDF_PATH/tools/ble/ble_uart_bridge +python main.py list-devices +``` + +Use the printed device identifier as `DEVICE_ID`. You can check whether the target device has been discovered by matching the MAC address or device name in the output. On Linux, the device MAC address is printed directly: + +``` +> python main.py list-devices + +2026-06-05 11:19:56.728 | INFO | src.core.scanner:scan_devices:42 - Scanning for nearby BLE devices in 5.0s... +2026-06-05 11:19:57.108 | SUCCESS | src.core.scanner:on_detect:39 - Found: 74:4D:BD:A9:ED:72, with name BleUart-ED72, rssi=-46 +``` + +The `74:4D:BD:A9:ED:72` MAC address and `BleUart-ED72` device name in this output match the firmware log above. + +On macOS, system restrictions prevent the tool from displaying the real Bluetooth MAC address. Instead, macOS assigns a CoreBluetooth UUID as the device identifier. Match the device name (`BleUart-ED72` in this example) in the `list-devices` output with the name shown in the firmware log to find the corresponding UUID: + +``` +> python main.py list-devices + +2026-06-05 11:19:56.728 | INFO | src.core.scanner:scan_devices:42 - Scanning for nearby BLE devices in 5.0s... +2026-06-05 11:19:57.108 | SUCCESS | src.core.scanner:on_detect:39 - Found: 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5, with name BleUart-ED72, rssi=-46 +``` + +The `5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5` string in this example is the CoreBluetooth UUID to use as `DEVICE_ID` on macOS. + +### Check the Bluetooth LE Link Before Opening Console + +```bash +python main.py connection-check "" +``` + +This command connects, discovers the BLE UART service and characteristics, then disconnects. On Linux or Windows, pass the device MAC address as `DEVICE_ID`: + +``` +> python main.py connection-check 74:4D:BD:A9:ED:72 + +2026-06-05 12:06:27.252 | INFO | src.core.bridge:connect:139 - Connecting to 74:4D:BD:A9:ED:72... +2026-06-05 12:06:37.460 | SUCCESS | src.core.bridge:connect:206 - Succeeded to connect to 74:4D:BD:A9:ED:72! +2026-06-05 12:06:37.461 | INFO | src.core.bridge:_disconnect_locked:86 - Disconnecting from 74:4D:BD:A9:ED:72... +2026-06-05 12:06:37.461 | INFO | src.core.bridge:_handle_disconnect:120 - Disconnected from 74:4D:BD:A9:ED:72 +``` + +On macOS, use the CoreBluetooth UUID instead: + +``` +> python main.py connection-check 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5 + +2026-06-05 12:06:27.252 | INFO | src.core.bridge:connect:139 - Connecting to 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5... +2026-06-05 12:06:37.460 | SUCCESS | src.core.bridge:connect:206 - Succeeded to connect to 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5! +2026-06-05 12:06:37.461 | INFO | src.core.bridge:_disconnect_locked:86 - Disconnecting from 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5... +2026-06-05 12:06:37.461 | INFO | src.core.bridge:_handle_disconnect:120 - Disconnected from 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5 +``` + +If this step fails, resolve scanning, pairing, permissions, or advertising issues before proceeding to the daemon or OpenCode integration. + +### Open ESP-BLE-UART Console + +```bash +python main.py console "" --terminator lf +``` + +In the Console, type a short line and press Enter: + +``` +hello from console +``` + +Expected result: + +``` +[INFO] Connected to 68:B6:B3:55:41:76 +[TX] hello from console +[RX] hello from console +``` + +- The Bluetooth LE address varies by device. +- Console shows `[TX]` lines for the input. +- The ESP-BLE-UART example echoes the same bytes back as `[RX]` output. + +At this point Bluetooth LE discovery, connection, host-to-device writes, and device-to-host notifications all work. The JSONL protocol (used by the ESP-VoCat example), daemon, and OpenCode Plugin are application layers on top of this path; they do not replace it. + +For more Console options such as hex mode, write-with-response, and alternate line endings, see [`tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md`](../../../tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md). + +## Part 2: ESP-VoCat OpenCode Companion + +### About ESP-VoCat + +[ESP-VoCat](https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s3/esp-vocat/index.html) is an intelligent AI development kit based on the ESP32-S3 module, featuring a circular touch display and single-key input. + +The [esp-iot-solution](https://github.com/espressif/esp-iot-solution) repository contains a `ble_uart_service` example (at `examples/bluetooth/ble_uart_service`) that runs on the ESP-VoCat development board. This example firmware renders session status as emote expressions and presents permission requests for physical approval. See the example README in esp-iot-solution for supported boards, required component versions, and build details. + +### Why JSON Lines + +Bluetooth LE writes are packetized by the ATT MTU, not by application messages. The ESP-VoCat OpenCode flow uses JSON Lines (JSONL) on top of BLE UART. JSONL works here because it is readable in logs, easy to type into Console for manual testing, parsable with cJSON on firmware, and covers both request/response and fire-and-forget patterns. + +### Architecture + +The ESP-BLE-UART Bridge tools and OpenCode demo plugin are included in ESP-IDF master and release branches starting from `release/v5.2` under `tools/ble/ble_uart_bridge/`. The `ble_uart_service` example implements the device side of the protocol and is available in the [esp-iot-solution](https://github.com/espressif/esp-iot-solution) repository. + +```mermaid +flowchart LR + OC[OpenCode] -->|session.status / permission.asked| Plugin[OpenCode Plugin] + Plugin -->|POST /notify| Daemon[ESP-BLE-UART Daemon] + Plugin -->|POST /request| Daemon + Daemon -->|Bluetooth LE write: NUS RX JSONL| ESP[ble_uart_service example] + ESP -->|Bluetooth LE notify: NUS TX JSONL| Daemon + Daemon -->|HTTP response| Plugin + Plugin -->|permission reply| OC + ESP --> Display[Emote + Tip Text] + ESP --> Key[Single Key: once / reject] +``` + +Each layer can be replaced independently: + +- Console verifies the raw BLE UART path. +- Daemon keeps one Bluetooth LE connection open and exposes local HTTP endpoints. +- The OpenCode Plugin translates editor events into daemon requests. +- The `ble_uart_service` example renders status and permission prompts on the ESP-VoCat device. + +### Start the ESP-BLE-UART Daemon + +First flash the `ble_uart_service` example from the [esp-iot-solution](https://github.com/espressif/esp-iot-solution) repository onto the ESP-VoCat board. This is a different application from the Console Echo Server: + +```bash +# Clone esp-iot-solution if not already available +git clone https://github.com/espressif/esp-iot-solution.git +cd esp-iot-solution/examples/bluetooth/ble_uart_service +idf.py set-target esp32s3 +idf.py build flash monitor +``` + +See the example README in esp-iot-solution for dependency versions and board-specific configuration. + +Then scan again and use the ESP-VoCat device identifier as `VOCAT_DEVICE_ID`: + +```bash +cd $IDF_PATH/tools/ble/ble_uart_bridge +python main.py list-devices +python main.py connection-check "" +``` + +Start the daemon with the ESP-VoCat device: + +```bash +cd $IDF_PATH/tools/ble/ble_uart_bridge +python main.py daemon "" --host 127.0.0.1 --port 8888 +``` + +> **Note:** The daemon HTTP endpoints are unauthenticated. Keep the daemon bound to `127.0.0.1` unless you add your own access control. + +In another terminal, check daemon status: + +```bash +cd $IDF_PATH/tools/ble/ble_uart_bridge +python main.py daemon-status +``` + +### Verify ESP-VoCat Through the Daemon Before OpenCode + +Do not use a generic `echo` request for ESP-VoCat validation; this firmware does not implement an echo op. Use the operations defined in the [esp-iot-solution example's json_format.md](https://github.com/espressif/esp-iot-solution/blob/master/examples/bluetooth/ble_uart_service/json_format.md). + +Session status smoke test: + +```bash +python main.py daemon-notify --op session.status --json '{ + "v": 1, + "kind": "session.status", + "event_id": "evt_manual", + "session_id": "ses_manual", + "requires_reply": false, + "payload": { + "type": "busy" + } +}' + +python main.py daemon-notify --op session.status --json '{ + "v": 1, + "kind": "session.status", + "event_id": "evt_manual", + "session_id": "ses_manual", + "requires_reply": false, + "payload": { + "type": "idle" + } +}' +``` + +The CLI wraps each JSON object as the daemon envelope `data` field with `op: "session.status"` and `id: ""`. The firmware receives a complete JSONL envelope over Bluetooth LE and updates the display without replying. + +Permission request smoke test: + +```bash +python main.py daemon-send --op permission.request --timeout 35 --json '{ + "v": 1, + "kind": "permission.request", + "event_id": "evt_manual", + "session_id": "ses_manual", + "permission_id": "perm_manual", + "requires_reply": true, + "payload": { + "id": "perm_manual", + "sessionID": "ses_manual", + "type": "bash", + "title": "Run idf.py build", + "metadata": { + "command": "idf.py build" + } + } +}' +``` + +The ESP-VoCat device should display a permission prompt: + +| ESP-VoCat input | Device reply | +|-----------------|-----------------| +| Single click | `decision: "once"` | +| Long press | `decision: "reject"` | +| 30s timeout | `decision: "reject"` | + +This manual daemon test exercises the same request/response path that the OpenCode Plugin uses. + +### Install the OpenCode Demo Plugin + +The OpenCode demo plugin is included in ESP-IDF under `tools/ble/ble_uart_bridge/demos/opencode`. + +Project-local install: + +```bash +mkdir -p /.opencode/plugins/opencode-ble-uart-bridge +cp $IDF_PATH/tools/ble/ble_uart_bridge/demos/opencode/src/*.ts \ + /.opencode/plugins/opencode-ble-uart-bridge/ +``` + +User-level install: + +```bash +mkdir -p ~/.config/opencode/plugins/opencode-ble-uart-bridge +cp $IDF_PATH/tools/ble/ble_uart_bridge/demos/opencode/src/*.ts \ + ~/.config/opencode/plugins/opencode-ble-uart-bridge/ +``` + +Then configure OpenCode. For a project-local install, put the following in `/opencode.json` or merge it into an existing config: + +```json +{ + "$schema": "https://opencode.ai/config.json", + "plugin": [ + ".opencode/plugins/opencode-ble-uart-bridge/opencode-ble-uart-bridge.ts" + ], + "permission": { + "edit": "ask" + } +} +``` + +For a user-level install, point `plugin` at the installed file under `~/.config/opencode/plugins/opencode-ble-uart-bridge/`. Use an absolute home path if the config loader does not expand `~`. + +Useful plugin environment variables: + +```bash +export OPENCODE_BLE_DAEMON_URL="http://127.0.0.1:8888" +export OPENCODE_BLE_DECISION_TIMEOUT_SECONDS=60 +export OPENCODE_BLE_DEBUG=1 +``` + +Restart OpenCode after changing plugin files, `opencode.json`, or these environment variables. + +### Run the OpenCode Demo + +1. Keep the firmware running and advertising/connected. +2. Keep the ESP-BLE-UART Daemon running on `127.0.0.1:8888`. +3. Start OpenCode in the project where the plugin is configured. +4. Trigger a permission prompt, for example an edit operation when `permission.edit` is set to `ask`. + +Expected behavior: + +- OpenCode session status is forwarded as best-effort `session.status` updates. +- ESP-VoCat shows busy/idle/retry expressions. +- Permission prompts appear on ESP-VoCat with compact metadata such as command, path, or URL. +- Single click returns `once` to OpenCode. +- Long press or timeout returns `reject`. + +To demonstrate bash or tool execution permissions, ensure the OpenCode permission config is set to prompt for that tool category. Otherwise, use an edit permission as the primary trigger. + +

+ ESP-VoCat Asking For Permission +
ESP-VoCat Asking For Permission +

+ +> **Note:** For a comprehensive understanding of Bluetooth Low Energy, see the [Bluetooth LE Overview](../../../docs/en/api-guides/ble/overview.rst). For Bluetooth LE connection management and data exchange, refer to the [Bluetooth LE Multi-Connection Guide](../../../docs/en/api-guides/ble/ble-multiconnection-guide.rst). + +## Protocol Reference + +The firmware protocol is documented in the `ble_uart_service` example's `json_format.md` in the [esp-iot-solution](https://github.com/espressif/esp-iot-solution) repository (`examples/bluetooth/ble_uart_service/json_format.md`). The outer daemon envelope has the following format: + +``` +{"v":1,"id":"","op":"","data":{}} +``` + +- `id` is non-empty for request/response operations such as `permission.request`. +- `id` is empty for fire-and-forget notifications such as `session.status` and `permission.cancel`. +- Device replies echo the same non-empty `id` and return either `ok/data` or `ok:false/error`. + +Example permission request over JSONL on Bluetooth LE: + +```json +{ + "v": 1, + "id": "perm-001", + "op": "permission.request", + "data": { + "v": 1, + "kind": "permission.request", + "event_id": "evt_...", + "session_id": "ses_...", + "permission_id": "perm_...", + "requires_reply": true, + "payload": { + "id": "perm_...", + "sessionID": "ses_...", + "type": "bash", + "title": "Run idf.py build", + "metadata": { + "command": "idf.py build" + } + } + } +} +``` + +Example device response: + +```json +{ + "v": 1, + "id": "perm-001", + "ok": true, + "data": { + "decision": "once", + "message": "Approved from BLE device" + } +} +``` + +`permission.cancel` clears a stale prompt without sending a later decision. This covers the case where the user answers from the OpenCode TUI before interacting with ESP-VoCat. + +## Troubleshooting + +- **No devices found:** confirm host Bluetooth access, firmware advertising, and proximity. Start with `list-devices` and `connection-check`. +- **Console works but daemon does not:** ensure Console is closed; this firmware accepts only one Bluetooth LE connection at a time. +- **Daemon disconnects:** the daemon does not run a background reconnect loop. When the next `/request` or `/notify` HTTP call arrives, it attempts an on-demand reconnect. If the device is unreachable for several consecutive attempts, the daemon exits automatically. Use `daemon-status` to check the current connection state and reconnect failure count. +- **OpenCode does not forward events:** confirm `OPENCODE_BLE_DAEMON_URL`, run `daemon-status`, and restart OpenCode after config changes. +- **Permission request times out:** confirm the device received a non-empty request `id`, no older prompt is pending, and the key was pressed before the timeout. +- **Unexpected rejections:** the demo is designed to fail closed. If the Bluetooth LE link, daemon, plugin, or device decision handling fails, the OpenCode side rejects rather than silently approves. +- **Pairing fails:** check the passkey printed in firmware logs and confirm the same value on the central. +- **Insufficient authentication:** if the connection or characteristic access fails with an authentication error, pair the device through the system Bluetooth settings first and enter the six-digit passkey shown in the firmware monitor log. Some desktop Bluetooth LE stacks require explicit system-level pairing before GATT operations succeed. + +## Extension Ideas + +- Add more input gestures for `always`, `edit`, or `deny for session`. +- Add richer display layouts for command/path/URL metadata. +- Add device-side settings for prompt timeout. +- Add an allowlist for low-risk commands. +- Add integration tests with a mocked daemon and simulated firmware replies. +- Replace JSONL with a compact binary protocol if a production product requires lower overhead. + +## Summary + +Each layer in this demo is small and independently testable: Console validates the raw BLE UART path, the daemon turns one Bluetooth LE connection into a local HTTP bridge, the OpenCode Plugin maps editor events to daemon requests, and ESP-VoCat provides the physical UI. Any layer can be replaced without affecting the others. diff --git a/examples/bluetooth/ble_uart_service/OPENCODE_COMPANION_CN.md b/examples/bluetooth/ble_uart_service/OPENCODE_COMPANION_CN.md new file mode 100644 index 00000000000..52988d08d2b --- /dev/null +++ b/examples/bluetooth/ble_uart_service/OPENCODE_COMPANION_CN.md @@ -0,0 +1,472 @@ + + + +# 使用 ESP-BLE-UART 与 ESP-VoCat 构建 OpenCode 伴侣设备 + +> [English](OPENCODE_COMPANION.md) + +## 介绍 + +本文档介绍如何使用 ESP-BLE-UART 和 ESP-VoCat 构建一个 OpenCode 的物理伴侣设备。该设备在显示屏上反映当前会话 (Session) 状态,呈现权限请求 (Permission Request) 供用户审批,并通过单键输入将权限决策返回给 OpenCode。BLE UART 作为设备与主机侧编辑器会话之间的传输层。 + +本教程分为两个部分。第一部分使用 **ESP-BLE-UART 控制台 (Console)** 搭配 `ble_uart_service` 回显服务器 (Echo Server),验证主机是否能够发现、连接 BLE UART 设备并完成数据交换。第二部分引入 `ble_uart_service` 示例固件(运行于 ESP-VoCat 开发板)、**ESP-BLE-UART 守护进程 (Daemon)** 和 **OpenCode 插件 (Plugin)**,使设备能够接收会话状态更新,并将 `once` / `reject` 权限决策返回给 OpenCode。 + +

+ ESP-VoCat 与 OpenCode 协同工作 +
ESP-VoCat 与 OpenCode 协同工作 +

+ +## 学习目标 + +- 了解 BLE UART 服务及其 GATT 约定 +- 掌握构建和烧录 ESP-BLE-UART 回显服务器的方法 +- 理解在 BLE UART 上运行的 JSON Lines 协议 +- 掌握 ESP-BLE-UART 守护进程和 OpenCode 插件的配置方法 + +## 前置条件 + +- 主机具备可用的蓝牙适配器和扫描/连接权限。 +- ESP-IDF 环境已导出。 +- 回显服务器冒烟测试可使用 `ble_uart_service` 支持的任意目标芯片 (Target)。 +- 完整 OpenCode UI 演示需要以下环境: + - [ESP-VoCat](https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s3/esp-vocat/index.html) 开发板(基于 ESP32-S3),配备圆形触摸显示屏和单键输入。BLE UART 传输层可以复用,但显示、触摸和表情 UI 为该示例的板级特性。该示例维护在 [esp-iot-solution](https://github.com/espressif/esp-iot-solution) 仓库的 `examples/bluetooth/ble_uart_service` 路径下,支持的板型、依赖版本和构建说明请参考示例 README。 + - `ble_uart_service` 示例首次编译配置时需要联网下载 `emote_assets.bin`;离线或内网环境下,请将 `EMOTE_ASSETS_BIN` 设置为本地路径以覆盖下载。 + - 安装 OpenCode 以运行插件演示。 + +安装主机侧 ESP-BLE-UART 桥接工具 (Bridge) 依赖: + +```bash +cd $IDF_PATH +. ./export.sh +python -m pip install -r tools/ble/ble_uart_bridge/requirements.txt +``` + +Windows 下请使用 ESP-IDF 根目录中的 `export.bat` 或 `export.ps1`,不要使用 `. ./export.sh`。 + +## 第一部分:ESP-BLE-UART 控制台验证 + +### BLE UART 简介 + +Bluetooth LE 协议中并没有传统串口意义上的 UART 外设。BLE UART 服务 (BLE UART Service) 是一种 GATT 约定:一个特征值 (Characteristic) 作为主机写入设备的 RX 通道,另一个特征值作为设备通知 (Notify) 给主机的 TX 通道。`ble_uart_service` 中的回显服务器使用 Nordic UART Service 风格的 UUID,将收到的字节通过 TX Notify 原样发回,适合用于验证主机侧控制台链路。 + +传输层只负责搬运字节。第一部分中,这些字节为普通回显文本;第二部分中,运行在 ESP-VoCat 上的 `ble_uart_service` 示例固件会在同一条 BLE UART 通道上叠加 JSONL 协议。 + +### 构建并烧录 ESP-BLE-UART 回显服务器 + +```bash +cd $IDF_PATH/examples/bluetooth/ble_uart_service +idf.py set-target esp32s3 # 或其他支持的 target +idf.py build flash monitor +``` + +配对期间请保持串口监视器打开。中央设备 (Central) 提示输入配对密钥 (Passkey) 时,输入固件日志中打印的六位数字即可。固件控制台输出应类似以下日志(地址和设备名后缀会有所不同): + +``` +I (548) ble_uart: BLE host task started +I (548) ble_uart: registered service 0x1800 handle=1 +I (548) ble_uart: registered chr 0x2a00 def=2 val=3 +I (548) ble_uart: registered chr 0x2a01 def=4 val=5 +I (558) ble_uart: registered service 0x1801 handle=6 +I (558) ble_uart: registered chr 0x2a05 def=7 val=8 +I (568) ble_uart: registered chr 0x2b3a def=10 val=11 +I (568) ble_uart: registered chr 0x2b29 def=12 val=13 +I (578) ble_uart: registered service 6e400001-b5a3-f393-e0a9-e50e24dcca9e handle=14 +I (578) ble_uart: registered chr 6e400002-b5a3-f393-e0a9-e50e24dcca9e def=15 val=16 +I (588) ble_uart: registered chr 6e400003-b5a3-f393-e0a9-e50e24dcca9e def=17 val=18 +I (608) NimBLE: GAP procedure initiated: stop advertising. +I (608) NimBLE: GAP procedure initiated: stop advertising. +I (608) ble_uart: addr=74:4d:bd:a9:ed:72 +I (608) NimBLE: GAP procedure initiated: advertise; +I (618) NimBLE: disc_mode=2 +I (618) NimBLE: adv_channel_map=0 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=0 adv_itvl_max=0 +I (628) NimBLE: +I (628) ble_uart: advertising as 'BleUart-ED72' +I (628) main_task: Returned from app_main() +``` + +`ble_uart: addr=74:4d:bd:a9:ed:72` 这条日志指示了设备的蓝牙 MAC 地址为 `74:4D:BD:A9:ED:72`。设备以最后一行 `ble_uart: advertising as 'BleUart-XXXX'` 中显示的名称广播。 + +当中央设备发起连接时,固件会输出配对密钥提示。如果系统蓝牙对话框或 `connection-check` 命令要求输入配对密钥,请输入监视器中显示的六位数字: + +``` +W (19298) ble_uart: +-----------------------------+ +W (19298) ble_uart: | BLE PAIRING PASSKEY: | +W (19298) ble_uart: | 617138 | +W (19298) ble_uart: +-----------------------------+ +``` + +### 扫描 BLE UART 设备 + +打开第二个终端: + +```bash +cd $IDF_PATH/tools/ble/ble_uart_bridge +python main.py list-devices +``` + +将输出中的设备标识记为 `DEVICE_ID`。可以通过输出中的 MAC 地址或设备名来判断是否扫描到了目标设备。在 Linux 上,设备 MAC 地址会直接显示: + +``` +> python main.py list-devices + +2026-06-05 11:19:56.728 | INFO | src.core.scanner:scan_devices:42 - Scanning for nearby BLE devices in 5.0s... +2026-06-05 11:19:57.108 | SUCCESS | src.core.scanner:on_detect:39 - Found: 74:4D:BD:A9:ED:72, with name BleUart-ED72, rssi=-46 +``` + +此输出中的 MAC 地址 `74:4D:BD:A9:ED:72` 和设备名 `BleUart-ED72` 均与上述固件日志一致。 + +在 macOS 上,由于系统限制,工具无法显示设备的真实蓝牙 MAC 地址,而是分配一个 CoreBluetooth UUID 作为设备标识。需要通过匹配 `list-devices` 输出中的设备名(此例中为 `BleUart-ED72`)与固件日志中的广播名,找到对应的 UUID: + +``` +> python main.py list-devices + +2026-06-05 11:19:56.728 | INFO | src.core.scanner:scan_devices:42 - Scanning for nearby BLE devices in 5.0s... +2026-06-05 11:19:57.108 | SUCCESS | src.core.scanner:on_detect:39 - Found: 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5, with name BleUart-ED72, rssi=-46 +``` + +此例中的 `5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5` 即 macOS 下用作 `DEVICE_ID` 的 CoreBluetooth UUID。 + +### 打开控制台前检查连接 + +```bash +python main.py connection-check "" +``` + +该命令会连接设备、发现 BLE UART 服务和特征值,然后断开。在 Linux 或 Windows 上,将设备 MAC 地址作为 `DEVICE_ID` 传入: + +``` +> python main.py connection-check 74:4D:BD:A9:ED:72 + +2026-06-05 12:06:27.252 | INFO | src.core.bridge:connect:139 - Connecting to 74:4D:BD:A9:ED:72... +2026-06-05 12:06:37.460 | SUCCESS | src.core.bridge:connect:206 - Succeeded to connect to 74:4D:BD:A9:ED:72! +2026-06-05 12:06:37.461 | INFO | src.core.bridge:_disconnect_locked:86 - Disconnecting from 74:4D:BD:A9:ED:72... +2026-06-05 12:06:37.461 | INFO | src.core.bridge:_handle_disconnect:120 - Disconnected from 74:4D:BD:A9:ED:72 +``` + +在 macOS 上,改用 CoreBluetooth UUID: + +``` +> python main.py connection-check 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5 + +2026-06-05 12:06:27.252 | INFO | src.core.bridge:connect:139 - Connecting to 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5... +2026-06-05 12:06:37.460 | SUCCESS | src.core.bridge:connect:206 - Succeeded to connect to 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5! +2026-06-05 12:06:37.461 | INFO | src.core.bridge:_disconnect_locked:86 - Disconnecting from 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5... +2026-06-05 12:06:37.461 | INFO | src.core.bridge:_handle_disconnect:120 - Disconnected from 5BA2476C-CDD2-BF3F-F98C-252CFA45F8B5 +``` + +如果此步骤失败,请先解决扫描、配对、权限或广播问题,再继续使用守护进程或 OpenCode。 + +### 打开 ESP-BLE-UART 控制台 + +```bash +python main.py console "" --terminator lf +``` + +在控制台中输入一行短文本并按 Enter: + +``` +hello from console +``` + +预期结果: + +``` +[INFO] Connected to 68:B6:B3:55:41:76 +[TX] hello from console +[RX] hello from console +``` + +- Bluetooth LE 地址因设备而异。 +- 控制台中显示输入内容对应的 `[TX]` 行。 +- ESP-BLE-UART 示例将相同字节回显,并显示为 `[RX]` 输出。 + +至此,Bluetooth LE 扫描、连接、主机到设备写入、设备到主机通知 (Notify) 均已验证通过。JSONL 协议(用于 ESP-VoCat 示例)、守护进程和 OpenCode 插件是叠加在该链路之上的应用层,不替代该链路本身。 + +更多控制台选项(如十六进制模式、带响应写入 (Write with Response)、不同换行符)请参考 [`tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md`](../../../tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md)。 + +## 第二部分:ESP-VoCat OpenCode 伴侣设备 + +### ESP-VoCat 简介 + +[ESP-VoCat](https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s3/esp-vocat/index.html) 是基于 ESP32-S3 模组的智能 AI 开发套件,配备圆形触摸显示屏和单键输入。 + +[esp-iot-solution](https://github.com/espressif/esp-iot-solution) 仓库中包含一个 `ble_uart_service` 示例(位于 `examples/bluetooth/ble_uart_service`),该示例运行在 ESP-VoCat 开发板上。此示例固件将会话状态渲染为表情动画,并将权限请求呈现到屏幕上供用户物理审批。支持的板型、所需组件版本和构建说明请参考 esp-iot-solution 中的示例 README。 + +### 选择 JSON Lines 的原因 + +Bluetooth LE 写入按 ATT MTU 分包,不等同于应用层消息边界。ESP-VoCat 的 OpenCode 流程在 BLE UART 上使用 JSON Lines (JSONL)。选择 JSONL 的原因:日志和控制台中可直接阅读,便于手动测试时输入,固件侧可用 cJSON 解析,且同时支持请求/响应和即发即弃两种消息模式。 + +### 架构概述 + +ESP-BLE-UART 桥接工具和 OpenCode 演示插件已包含在 ESP-IDF 的 master 及 `release/v5.2` 及以上 release 分支中,位于 `tools/ble/ble_uart_bridge/` 目录下。`ble_uart_service` 示例实现设备侧协议,源码位于 [esp-iot-solution](https://github.com/espressif/esp-iot-solution) 仓库。 + +```mermaid +flowchart LR + OC[OpenCode] -->|session.status / permission.asked| Plugin[OpenCode Plugin] + Plugin -->|POST /notify| Daemon[ESP-BLE-UART Daemon] + Plugin -->|POST /request| Daemon + Daemon -->|Bluetooth LE write: NUS RX JSONL| ESP[ble_uart_service 示例] + ESP -->|Bluetooth LE notify: NUS TX JSONL| Daemon + Daemon -->|HTTP response| Plugin + Plugin -->|permission reply| OC + ESP --> Display[Emote + Tip Text] + ESP --> Key[Single Key: once / reject] +``` + +各层均可独立替换: + +- 控制台验证原始 BLE UART 链路; +- 守护进程维持一个 Bluetooth LE 连接并提供本地 HTTP API; +- OpenCode 插件将编辑器事件转换为守护进程请求/通知; +- `ble_uart_service` 示例在 ESP-VoCat 设备上显示状态和权限提示 (Permission Prompt)。 + +### 启动 ESP-BLE-UART 守护进程 + +首先从 [esp-iot-solution](https://github.com/espressif/esp-iot-solution) 仓库将 `ble_uart_service` 示例烧录到 ESP-VoCat 开发板上,该示例与第一部分的控制台回显服务器为不同应用: + +```bash +# 如尚未克隆 esp-iot-solution,先执行克隆 +git clone https://github.com/espressif/esp-iot-solution.git +cd esp-iot-solution/examples/bluetooth/ble_uart_service +idf.py set-target esp32s3 +idf.py build flash monitor +``` + +依赖版本和板级配置详见 esp-iot-solution 中的示例 README。 + +然后重新扫描设备,并将 ESP-VoCat 的设备标识记为 `VOCAT_DEVICE_ID`: + +```bash +cd $IDF_PATH/tools/ble/ble_uart_bridge +python main.py list-devices +python main.py connection-check "" +``` + +使用该 ESP-VoCat 设备启动守护进程: + +```bash +cd $IDF_PATH/tools/ble/ble_uart_bridge +python main.py daemon "" --host 127.0.0.1 --port 8888 +``` + +> **Note:** 守护进程 HTTP API 未内置认证机制。除非自行添加访问控制,否则请保持绑定在 `127.0.0.1`。 + +在另一个终端检查守护进程状态: + +```bash +cd $IDF_PATH/tools/ble/ble_uart_bridge +python main.py daemon-status +``` + +### 在接入 OpenCode 前通过守护进程验证 ESP-VoCat + +不要使用通用 `echo` 请求验证 ESP-VoCat,该固件未实现 echo 操作。请使用 [esp-iot-solution 示例中的 json_format.md](https://github.com/espressif/esp-iot-solution/blob/master/examples/bluetooth/ble_uart_service/json_format.md) 中定义的操作。 + +会话状态 (Session Status) 冒烟测试: + +```bash +python main.py daemon-notify --op session.status --json '{ + "v": 1, + "kind": "session.status", + "event_id": "evt_manual", + "session_id": "ses_manual", + "requires_reply": false, + "payload": { + "type": "busy" + } +}' + +python main.py daemon-notify --op session.status --json '{ + "v": 1, + "kind": "session.status", + "event_id": "evt_manual", + "session_id": "ses_manual", + "requires_reply": false, + "payload": { + "type": "idle" + } +}' +``` + +CLI 将每个 JSON 对象作为守护进程信封 (Envelope) 的 `data` 字段发送,并设置 `op: "session.status"` 和 `id: ""`。固件通过 Bluetooth LE 收到完整 JSONL 信封后,更新显示但不返回响应。 + +权限请求 (Permission Request) 冒烟测试: + +```bash +python main.py daemon-send --op permission.request --timeout 35 --json '{ + "v": 1, + "kind": "permission.request", + "event_id": "evt_manual", + "session_id": "ses_manual", + "permission_id": "perm_manual", + "requires_reply": true, + "payload": { + "id": "perm_manual", + "sessionID": "ses_manual", + "type": "bash", + "title": "Run idf.py build", + "metadata": { + "command": "idf.py build" + } + } +}' +``` + +ESP-VoCat 设备应显示一个权限提示: + +| ESP-VoCat 输入 | 设备响应 | +|----------------|---------------------| +| 单击 | `decision: "once"` | +| 长按 | `decision: "reject"` | +| 30 秒无输入 | `decision: "reject"` | + +该手动守护进程测试验证的是 OpenCode 插件后续使用的同一条请求/响应链路。 + +### 安装 OpenCode 演示插件 + +OpenCode 演示插件已包含在 ESP-IDF 中,位于 `tools/ble/ble_uart_bridge/demos/opencode`。 + +项目级安装: + +```bash +mkdir -p /.opencode/plugins/opencode-ble-uart-bridge +cp $IDF_PATH/tools/ble/ble_uart_bridge/demos/opencode/src/*.ts \ + /.opencode/plugins/opencode-ble-uart-bridge/ +``` + +用户级安装: + +```bash +mkdir -p ~/.config/opencode/plugins/opencode-ble-uart-bridge +cp $IDF_PATH/tools/ble/ble_uart_bridge/demos/opencode/src/*.ts \ + ~/.config/opencode/plugins/opencode-ble-uart-bridge/ +``` + +然后配置 OpenCode。项目级安装时,将以下内容放入 `/opencode.json`,或合并到已有配置中: + +```json +{ + "$schema": "https://opencode.ai/config.json", + "plugin": [ + ".opencode/plugins/opencode-ble-uart-bridge/opencode-ble-uart-bridge.ts" + ], + "permission": { + "edit": "ask" + } +} +``` + +用户级安装时,将 `plugin` 指向 `~/.config/opencode/plugins/opencode-ble-uart-bridge/` 下的入口文件。如果配置加载器不展开 `~`,请使用绝对路径。 + +常用插件环境变量: + +```bash +export OPENCODE_BLE_DAEMON_URL="http://127.0.0.1:8888" +export OPENCODE_BLE_DECISION_TIMEOUT_SECONDS=60 +export OPENCODE_BLE_DEBUG=1 +``` + +修改插件文件、`opencode.json` 或上述环境变量后,需要重启 OpenCode。 + +### 运行 OpenCode 演示 + +1. 保持固件运行,并处于广播或已连接状态。 +2. 保持 ESP-BLE-UART 守护进程运行在 `127.0.0.1:8888`。 +3. 在已配置插件的项目中启动 OpenCode。 +4. 触发一次权限提示,例如当 `permission.edit` 设置为 `ask` 时执行编辑操作。 + +预期结果: + +- OpenCode 会话状态以尽力传递 (Best-effort) 方式转发为 `session.status`; +- ESP-VoCat 显示 busy/idle/retry 表情; +- 权限提示显示到 ESP-VoCat,附带命令、路径、URL 等紧凑元数据 (Metadata); +- 单击返回 `once` 给 OpenCode; +- 长按或超时返回 `reject`。 + +如需演示 bash 命令或工具执行权限,请确认 OpenCode 权限配置确实会对该工具类别发起询问;否则建议使用编辑权限 (Edit Permission) 作为触发路径。 + +

+ ESP-VoCat 请求权限 +
ESP-VoCat 请求权限 +

+ +> **Note:** 如需全面了解 Bluetooth Low Energy,请参见 [Bluetooth LE 概览](../../../docs/zh_CN/api-guides/ble/overview.rst)。关于 Bluetooth LE 连接管理和数据交换,请参考 [Bluetooth LE 多连接指南](../../../docs/zh_CN/api-guides/ble/ble-multiconnection-guide.rst)。 + +## 协议参考 + +固件协议详见 `ble_uart_service` 示例中的 `json_format.md`,位于 [esp-iot-solution](https://github.com/espressif/esp-iot-solution) 仓库 (`examples/bluetooth/ble_uart_service/json_format.md`)。外层守护进程信封格式如下: + +``` +{"v":1,"id":"","op":"","data":{}} +``` + +- `id` 非空表示请求/响应操作,例如 `permission.request`; +- `id` 为空表示即发即弃通知,例如 `session.status` 和 `permission.cancel`; +- 设备响应会带回相同的非空 `id`,并返回 `ok/data` 或 `ok:false/error`。 + +Bluetooth LE 上的 JSONL 权限请求示例: + +```json +{ + "v": 1, + "id": "perm-001", + "op": "permission.request", + "data": { + "v": 1, + "kind": "permission.request", + "event_id": "evt_...", + "session_id": "ses_...", + "permission_id": "perm_...", + "requires_reply": true, + "payload": { + "id": "perm_...", + "sessionID": "ses_...", + "type": "bash", + "title": "Run idf.py build", + "metadata": { + "command": "idf.py build" + } + } + } +} +``` + +设备响应示例: + +```json +{ + "v": 1, + "id": "perm-001", + "ok": true, + "data": { + "decision": "once", + "message": "Approved from BLE device" + } +} +``` + +`permission.cancel` 用于清理过期的权限提示,不再发送迟到的决策。适用于用户已在 OpenCode 终端界面 (TUI) 中处理了权限请求、但 ESP-VoCat 仍在显示权限提示的情况。 + +## 故障排查 + +- **扫描不到设备:** 确认主机蓝牙权限、固件正在广播、设备距离足够近。先用 `list-devices` 和 `connection-check` 排查。 +- **控制台可用但守护进程不可用:** 确认控制台已关闭;该固件同一时间只接受一个 Bluetooth LE 连接。 +- **守护进程断开连接:** 守护进程没有后台自动重连循环。当下一次 `/request` 或 `/notify` HTTP 请求到达时,守护进程会尝试按需重连。如果设备连续多次不可达,守护进程将自动退出。可使用 `daemon-status` 查看当前连接状态和重连失败计数。 +- **OpenCode 未转发事件:** 确认 `OPENCODE_BLE_DAEMON_URL`,运行 `daemon-status`,修改配置后重启 OpenCode。 +- **权限请求超时:** 确认设备收到的是带非空 `id` 的 `permission.request`,没有旧的权限提示仍在等待中,且用户在超时前已按下按键。 +- **出现意外拒绝:** 演示采用失败即关闭 (Fail-closed) 设计。Bluetooth LE 链路、守护进程、插件或设备决策处理中任一环节失败,OpenCode 侧都会拒绝而非静默允许。 +- **配对失败:** 检查固件日志中打印的配对密钥 (Passkey),确认中央设备端输入的是同一个值。 +- **认证不足 (Insufficient Authentication):** 如果连接或特征值访问时报认证错误,请先通过系统蓝牙设置完成设备配对,并输入固件监视器日志中显示的六位数配对密钥。部分桌面 Bluetooth LE 协议栈要求在系统层面完成显式配对后,GATT 操作才能成功。 + +## 扩展方向 + +- 增加更多输入手势,支持 `always`、`edit` 或"本会话拒绝"。 +- 为命令/路径/URL 元数据设计更丰富的显示布局。 +- 在设备侧增加权限提示超时设置。 +- 为低风险命令增加允许列表 (Allowlist)。 +- 使用模拟守护进程和模拟固件响应进行集成测试。 +- 如需更低开销,将 JSONL 替换为紧凑二进制协议。 + +## 总结 + +本演示中的每一层均保持简单且可独立测试:控制台验证原始 BLE UART 链路,守护进程将一个 Bluetooth LE 连接转换为本地 HTTP 桥接,OpenCode 插件将编辑器事件映射为守护进程请求,ESP-VoCat 提供物理 UI。任意一层均可单独替换而不影响其余部分。 diff --git a/examples/bluetooth/ble_uart_service/README.md b/examples/bluetooth/ble_uart_service/README.md index 88b2311dbda..7ac05d24644 100644 --- a/examples/bluetooth/ble_uart_service/README.md +++ b/examples/bluetooth/ble_uart_service/README.md @@ -1,4 +1,4 @@ -# BLE UART Service Example — NimBLE / Bluedroid +# ESP-BLE-UART Example — NimBLE / Bluedroid | Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S3 | | ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | @@ -58,7 +58,7 @@ The `_ENC | _AUTHEN` flags are turned on only when `cfg.encrypted = true` | `../common/ble_uart/ble_uart.h` | ~155 | Stack-agnostic public API: 3-field config + 4 lifecycle functions + TX/status + UUID + `BLE_UART_E*` return codes. No NimBLE / Bluedroid types leak through. | | `../common/ble_uart/ble_uart_nimble.c` | ~650 | NimBLE backend: host bring-up, BLE UART GATT service via `ble_gatts_add_svcs`, advertising, pairing, install/open/close/uninstall. Active when `CONFIG_BT_NIMBLE_ENABLED=y`. | | `../common/ble_uart/ble_uart_bluedroid.c` | ~1020 | Bluedroid backend: controller + host enable, BLE UART GATT service via `esp_ble_gatts_create_attr_tab` (service-table API), advertising, pairing, full PREP/EXEC long-write reassembly, install/open/close/uninstall. Active when `CONFIG_BT_BLUEDROID_ENABLED=y`. | -| `../common/ble_uart/Kconfig` | ~30 | Device-name prefix + RX scratch size (`menuconfig → Component configuration → BLE UART library`). | +| `../common/ble_uart/Kconfig` | ~30 | Device-name prefix + RX scratch size (`menuconfig → Component configuration → ESP-BLE-UART library`). | | `../common/ble_uart/PORTING.md` | ~724 | Porting and API guide (integration, CMake, sdkconfig, thread safety). | | `sdkconfig.defaults` | — | Default: NimBLE backend, MTU 512, SC + bonding + persistent NVS. | | `sdkconfig.bluedroid` | — | Overlay: switch to Bluedroid backend (used via `-D SDKCONFIG_DEFAULTS=...`, see "Choosing the host stack" below). | @@ -133,7 +133,7 @@ When neither is enabled the build fails up-front with a clear error. ```bash idf.py set-target esp32c3 # or esp32, esp32s3, esp32c6, esp32h2 ... idf.py menuconfig # optional -# Component configuration -> BLE UART library +# Component configuration -> ESP-BLE-UART library # - BLE device name prefix (default: BleUart) # - RX scratch buffer size (default: 1024 bytes) ``` @@ -249,6 +249,16 @@ ble_uart_open(); That's it — encrypted serial-over-BLE in 4 lines. +## OpenCode Companion + +This example serves as the transport layer for the [OpenCode Companion tutorial](OPENCODE_COMPANION.md), which walks through building a physical companion device for OpenCode using ESP-BLE-UART and ESP-VoCat. The tutorial covers: + +- **Part 1:** Using ESP-BLE-UART Console to verify the BLE UART data path (Echo Server mode). +- **Part 2:** Using the `ble_uart_service` example on ESP-VoCat with the ESP-BLE-UART Daemon and OpenCode Plugin for session status display and physical permission approval. + +See the full guide in English: [OPENCODE_COMPANION.md](OPENCODE_COMPANION.md) +Chinese version: [OPENCODE_COMPANION_CN.md](OPENCODE_COMPANION_CN.md) + ## Troubleshooting - **Phone shows "pairing failed"** — the central asked for "Just Works" diff --git a/examples/bluetooth/ble_uart_service/assets/ESP-VoCat-Asking-For-Permission.png b/examples/bluetooth/ble_uart_service/assets/ESP-VoCat-Asking-For-Permission.png new file mode 100644 index 0000000000000000000000000000000000000000..d3f5679ad6af5d25ba12b909866f3dd330f0e248 GIT binary patch literal 322588 zcmV)uK$gFWP)-jwFZ)plTjpX4R1Ie-7_?%ZK9GJv*G;neFMyFWgN5;RSwFEwYx3&aRA%@NhR% zQw0P90U-ac|L6ZhL;#40h{iVn1pRG(CtClJzv#abzy(5z3Lru=F2nZzKG2Svh3sejUogVKiR0;%+yaEA96#*o# zGG7QVuATAufI|9j;sZ%~+yg}gq{l5I{;U@Xpg<&-OC(p7fCvGVS_wSAq;97Fv%lEC ztjku@e4vk2{OKqhvm%Q#T78O3gZbA4tiWp{1HLc z1q$5r65<(yjK|#UqX>kOcg`KkxhZ_xoSppTGX~`JcbP z|Kt1pukZVtw4r0lbvNwny-1iUgPU)zOFGug|JwjQ8y@}Lx)1$e698Se*d4p z|KmUY_22*Z|M+kJ{eS*{e&7G;a3QodXPp9SK1$Uw{&@Xk$P|joBsEqMPBZ@g{QlSX zf3EcrfvUc)Uw{1Z&wqUVmw){EfB)wn|F^H#AHTl-@sD5s{Pp$6b-l)zs#8_X%+1`) z*1GTYx$pbF@6YFb-|x@+`}_T`zka{Jzu({Q_viijyzl#Vqt+IW?MoncGKn~=q==BBcG-UP@e?;QH+TASy3@@`r}=VoCrL94b28?*uGeeMG3S``dR^DNUe~1}^Sb67 zszXIog{s@6lMtw?Kt<)c=GWKPoI2+aQ4yJQjxkiBDq~C?s-hy$Ap#}c-P;@h4p8ET zWVky>QSEgQ5k2fpo@$AugTz@U0SyB&L_w-*JUHpc6=qXJR8(SnLPbO{L{v3DOY=5W zRUr_H<~4|F*zPd73emg_kKe~9X)F}r?zYzFw)gw}`F!5*_xJbr@9+0t-`{`z{{H>@ z{jY!h=U@N&{jcBO@AoGT4e9MWa2V$wMy~wewtnXe+Eo7dD&rLfuiZ%6Iw$g3F#S`! zr>*$boNx!-LAtxq=@h{0qXl?8DG{Ax41K-kA7As=>-u%guS@^&HUIb;U(+w;00DPj zbaz{3x2@$gDW64%mw}lRbBIEQv(@)ZUgP!B zUvrF6C)&Bp?%QvdWi*q|lK0!cZ+w4n8_ckrpT+yO@7vxV`~Ix=ZSUppwLa$eA^{Z{ zs&nWVGDU~Rm&|KkbB-}ZMT80=+}wQ8jJMk|TjtC1$S!v`Zc7?oQxzn@d2Rrbu{}55 zXaG|ir{I?$p-ci5qAeQtPWrixghD1zQh~5tGa4y05J^zL4U4>iUmWx@w5$!P;t-I6 zhE@b94UhH-2=~0vjYt?+0vbkoLkA$B!vmxUgoUBPgyo&4m1o!j-~mJmz8pC7=Lvkk zoc07b-w1K0`(+{mIgcoD{!O@b!SlT5@}4h7y9uK3i##wv0-O9M2v+zT7x z#tSsIbo`g(_xne=F=`9-Q^;k^>(-%T$e81r~>mK)K%KMt%-}(~FA@@C(j+?}FaZZ#OFI3sjdq1~Aa5T`R zP)mGYFUS+Lw=&s#Y{MHk@)4I!3X~gW3j1Q}QTN%Q7w%$NgTB0uj!;G~4G~;K<7AY1 z3P%E!x@v&56fr>D1FPmuLLj+Wq@o%m&e`E#+t2)ostRK1;vVC+a!uSb z(xy`t9q0m}k&+QSg+s*%r^PxrJunzaipIebh^vTG1S(Jwh&z;;3oYs+uUN_41WsRc zha27K%gsC>F5GFhmRX=*rsZRq72@B0)kDcGbjD_F@WV2&BHF_a_9lR){eeh)xO9w} zcr{JBFe5y895a@S+?TXJy04@S766C>N~$@Q;{`EbIfs$%Q(Wjy(rL@xT@cY48~zOu z6^sE@sCXgS*wwC1x|=%Sbb^c*k0C>;5&??K_8WelWmU`}PKScT5Dw)KOm$E}adIdv zKiULzGh1fMm$|tI01?j+0YhL8h^U%bT&z$w~LO5vt5@X z&#>q91eGN4><$D*cuk5Tm$2t_SZ86 zDMuhIo~RE{9Ht}6&PPz(Ond1JJ@=aD|EiM5fu@{xn*iu(0n6GanxsRu4yu%osSVH} zkVvyVy}}LsIs#9E@BCa8O;!9KPM7i^+)f9RRz&bbSGkHp{)9q_pVD*{$pH{9jVdAZ z-XvkIa)m|2&npoPFPC02o*D(7*4XOqJdKgG-Rj*Cq{iu#^BUPUR_bCC76=aiSuiQ0R2O$(M{dbWBWv(glR6tB%+yzxmsInceUA?;&%(FV#zB zs_2-LLcAPs(&wD9$(=Cf;q+dOT2N1%MH=C`n)^9}@u<$TR>Z1MSg*;2=E=0ikve&X z9XN!KE-xtpdd7C(-dyR|4g-jcC)3=Bh%ik;pJUnAlIUJEz6iU!IZ4$4IgS-1aIQPUHM&tm>2RTx{R?a1?q(iAuBxc2 z&^>O9E)WEjPjsH60_D60IlOrKuQ&k|5#+JT5XQBf#m}^WXZRWrLPS*PN^wyU2UXSK zR4PRw;-X3wF~A@yqDrBp!F2?(jh&+)Y36S3X69a`qJz%xt;>s1WP6S?;CdKgZgMCo zfR4_Z>`8;4*6+C4pg+^PwI9&l@bMc>YOrmz#3Hc|PJODQ?Rpa<)bQYE>PAFFhNwVE zF{(KOX5HpOUJ94oje+D;RMZs|p{fhu6p&M>3LUW}NVo=n1**n#b_W5fiYi1nK#i0{ z*jiPHYn&Qn63qw2pvtKkwM1mAf+28OQ`OyFe5haQD=?Or)66~B8ctVJ!hMLsJ@AAt z>WB}r2t2%ekrO5`&;f^-(=B!dJa6RS$UQgt+@zL7468hLMA|*4v`MCmh$A2Mh6oMA z+o}k|PD$ER3IdzPaz#J{K%kNzS7dJQGXX$NLsuKk6Nns1v8L1T6XUdLB}Ji;U+iC( ziG3Uqkpo-pBv~(oqK7^4eXShRJW_h&6YnvG!b{ zi2a;?vY=sN1VhIhm(y@jRBcZBi=?Oy)oZ-we7(k;dd)G%m?{9)qB|oL+vr_H$Cy(u zDsS_lou;|xUP9Ece)87DykC5M1(3MajUACo82-7TJ~hiQYwQX;9~R9dw#w z8e~z_TtNtxQ1Jn%s1A?UE7(au@w6wIgU$Q)d}0At#0BvW1gat<&M-5(m9Ok=+NmbG z3M`^Sr@|GGVE{cohU^J~0-{ zMCrezBTj|~1&oJlGxH7xUx?jnAFuoVl1PAPM72%371`b z7?QwZ;H;fENKeGZJ7taz`%>-%siq;65g4Xns~Dj^-_a;Ufs=iySPKQ^imF9Lp3JB; zex*`>UU{%1G1`9O(6iykDjfd(i7_^>e#U&KFQGR{-#>ijFU#rY<6+$&p6;CmPwQc$ zyi8I2`?~kVpXXkZh^)I7Y}Q6<>Fez@=+hlSKffN!^y3%X`Le^jq|0-s6y)Z9T*n2b zg(^0``~d3D;>{=(CuKJ3pz*zJ3HD2bQ*qj0x z$?8Ky1wKS9&pXX-cate&PQ_3N9Hh7>4YSOg>$AQAyYKG|n4J*JF-K@}C<+y5J|;$% zNwy;>wH#Qv=h(g~wA8m{*iT78TW_OyK<=uk=3!;?QJ4lI36Lu|O5m0UcC)eMgVxN; z^G9Z9Cptt(4z2KqN8&QKOUEw7?F)dUPBln{!XF~yZcdMQbf5RQfa8AqGFU`Pp01Ek z2?TJbq!tO%2eZ@D9+U=zjA%tbrwdiX&L8(-mf5k$j|de5zSyglX`%2L$tnq~da6;nT?CfN%_qJudlge9WE<*wiGPN&}AvULptWZ}eRCEZ3*Z?%evjKH8 zc?k@aaQ~h;E&&*D%FC9zfC|yj^NB(%baJ3aVp>E&i=E}}a(F}mDRg)xYzerkx?xCg zqa5N>{Wa(V9KuUf@F8x;q7$KDH4hM|qC<^P0`5~)Vucxi_OKtUf69WTKRTGFun2Q2 zuG(3a-H$ZNDOXgsOD@@DX~0>hXgsn&+vW%~p;S73J-v19w0`4$zCij&IPb|00z*Z%Bw5_K*30qy!-D#_lcXaA;OSt)-F z{u332Cy=hc$KP)Mw5LZLm<(~)E9@w@fMtU(I$PcEl4NxyCXYnZsja~l=hgGWX5OM0 zL5g(Y`C_R>*9wZ5XFkY`QtK0rB3{bQ<&w5zf{SqIzy(n(6JU}?V90olDXL?Csbu!BKHA|mN_$$}FPO{a>edZTI)N{U%q@TY;}#8FDEAA$lN z+gwE4MK#SnL80a<1Aw@jt()!yoQs~f;_e#ao6=qdD>PIU@Yqxl@CJRO8s;^qpMWBo z`RTa(nZ|t-Go%4iypOPEa-=F#B@1~l-xW|lA>XI3V83fiC|?liMy z_igLG*JrKU*K%9rinO8EM%{LmILNjJF7XqUbFU|qE^)!(G^#dhGp5@@<+X~a24_VP zXl^?NDdrR%0to2lDdxU~T zR?>lB`9uKB_Q4&m|4jr#Pv1aKjFuTjAhN;_Ky{KWCm*pnCrDxRrdcuy@+u@NxdJ09 zLGG)aE=Hs>D_y$FvJY`->S@WX9h}biQ6gFsVEx@tqB4FLQsNz>yZk|8yI0J`_ z@tTE`BhLL1pEabAw%P?Z`;~Qvny0stXr0lozw1l!22w@#;5bdaSeq=&&D48l*QqehdiVOjU&XHfK!TNgr@m_z~=avM1C^aIHF;zPWUv@A1 ze1Y?t6H{df)g8kL40m@J2z>wNy}q4x-`^xebk5h*Q7|&x^=kyc%EdV1=}q~S_V3tt z5vIr9QGw?Z)}}HGDltP|Ngx$btUL~X5@km~(kGX#K+W<&7((dn2hG6Tz;com=T=Q_ zbyHd*3OXbpil~V7Zs{$Zsfvz-TTvpgR*@rIY+EHt2r?h~t?4?SYmZ|9sxmD3C=hJ*7 z1Ek#3Vcn&qKy05O0qvRD%c!aFF>DmwFa2&I1vgJ6kL#F|bkO6;^qEhHm)qVwC4Z^Q zQVp6sN>?M!Q7VJLasU{qGEah;h`b@ZD%n%&DZ-(2^=lwBiwYaUsTj9^Ow6$$PIng< zb#k;7+NMFasoDafOtpIyk!(&viqlb$vph_4%TW)K&zoNE^du3ZVk5o=0FTHjEp=a9Lx1^vA5g+QUlYeT~ik-Yau*kM7jZ_Z0=`f}hFl1sN ziJyLd9H%aW9o;I^vQgz!(z|F~qt>sH9TM`|`bbOdgsyWr?k@lSFfVlrr`Y0Yq3{Dr z=6`ls;PGht)Arl6S=;w~B)`jq6(=aE(mZHA7SnacEB)j%gx<>w2;7?*DHj^WN|3F8 zK|(^79z}f;B11)Eha-Ibc}ILy{_?k&9B$%>(~A3 zef_!YZT9Z{S;Sy#Me4Tb%WwB3B6D0S*Pwa|G8FVv&-1?jqT9OPzvX|%MTn~C7{!}I zr^*m0Jy&TvP4>WB!?*a`&`703<^fi~hY9Ye%PbGJ|=$0k;Z&vG~6jyM7)sSYzA!(27GMTp24 zDgqZq^`Z#ooGN4JP?4!K@YSwNPTD3zo1xnj1Tn-~o@3QKGW=-_r7%IE-R>VGyHnOVX;L+>x95h1S zt88kMWsW5&(K69PHFwgnqXyLabRAUfnbQQaI01!#Mg;hh`g{pBj8MQpzzPh-5JvFi zkpy&t8p}txP#qKreW)l3m*>ffP=m7XlJ1e>rz)HtajP3?pr(s=k3!c_7LuNt^{t1Z z6~Ly@6&y-;jv)ZCC^Mw4GR?=}T=Fr9i8%&xMw3oK4pHYA}#N9NqZ4iXRwe7{9;FkJ=1+#T)trQL5y3d)Bb z$U=G>_Qq&KRc~-cHwna34Hn!+{Y{u)fb=a?=wtBAj~$9^pa``aVjgf?_WhA9qO~(PHBk%fad0OdUZ5_ z5Uv7Mh+yg*G6fo^ed@S$zOL8Ty4Jkz`N#eG^JDMN`Zk)tRYfy-E$!m8s*N1(H0J_2 z#=P_uZ*J!IxRN?MB9+hm+rf2z{=)yMNlVB?>9_TzIy6YEY|heq>M#OTWZaZ<1?mBu zP;$F{8aGOm2muugl~JAbhzp}XO*39H_G6OdBa@lH>BKiD(Yv%=rj*e*sU*=#sq`y= z)384GKWeXf=FOry3Xv4kWmb`0fS^2AyUMOYNTzd8wEQ7EwWWfVTO$!7Bt)%4F>=X5 zfms3P1*QsF(7gechfi%fN<@aZ1auM|s^c0WFoO&oItGK{nt-Z~p*qHxb7l}xr$2y# z!`&^e;H0leklF4oea4Qy^f=t{8_&A|y8bk2lW5;4l8SYBl2vAAfvd7{+r505FZU3^ zI}OEDmdQLk)1lHs1z~c8#6O?@!Ex`GZk{O}WO#b-mjW(qpq!a(C5zy-9o*4*xcB1K zk%2*-EtM#7V`8ar>rjZwkZ40DRK?J;=b?ZKAQ$4y6utF()Ch;zI$4iX(t<=&lUbE`ZCC;<%_j9tx7GHZstmYi1#a=upgoF)$a# z;xZ8GqGQeom@*ZxJ*bk@kWL2nDt`LN6!sRCEWS`ok^L?_ck$!tM4v?$7(oeGqSe7I zUU`(B76pik4(riwp5-96*~R(NJXC{$_-VSBOf4b|!a<54^$CrLs}}>x?iEJo`PoG# zcNE-qvf(w)KS)3P3_Mck9${S3XHtPpp{R7RPDZ=DovwPW^$C@5L~~EjvFTl+pb|8PWp7xz9Zf&H?Ceolw@T3_s613>hh{)FKVO^wc;*ju^TT5ubb7rY zcJ(gJdf?G`#V+qENR?|MrKcG-`|;fYr)y1=N&HRl*FpeRT0ohJ)R;GNvEhN;WS0K+jOF*)~Zgu z)ElxHkL)>>z?TB?=)>(F+tiT3vOr&B385}-kflq86RMMGYeN3d1B3qm5C zaij`{>YQ_ljxk2Hs*)jd*fmBVsxfq^&N1dSLoirulN1(lC(R8JOL+DRu8V+G;8TrY z_tTY>$P{u3x*@}QM5>7bF_F+<5ekPeiK;?ZYuT#KNw=A2Xp^Gq%0F()>Ccn`ljA8$ zxI(FCCB?>k+*bFD#>;DNHnN&k5Oj7=OH__2c+=u_cpkA%XtvcZyw)2<3b;!VlR8CT zL$853pz5T<3)~uluCHuax?@ctU*0SOp(HBJJ8{CCMyy3AXi%X#DICK;hRb9QHRBQv zr6CU`Go6H})Pn`h8s#Y6YKkfxpo20-lrT+~<rfwRhym-f~Qgl&!LL|}EbWx+ZVyq5XRGMA%hv#GJ@aRYmMC_7V`I$N@ z0;`h}9d{J7R(HW_CRTh!bv^J+X4Ul-q$@t}p{F_k$B&;%ojs|aCy`c6Rkm>HW!&pG z&J$crb+1p!+vBKumNd5?D>PaZ)NY8UnJKG2uI&Q3W0d{5XC9`(>N6Rd0H@L&b^hx; z3Z;2(gd>F=RDm`dpEk8O#7+%vH2%1{%nC<%k-kkDv~8GJ!DQ0(=zee;nbkGr73R&< zzaNy@c^~yxp$JLEN^mq$gW(k;WYdR0R1rxhQ=WTMAw%VYOpzhgQAI@OoG+i|uY0|| z%x?SjhyBxhf&Tq=w@){YMNzTEh$K4`Mw6tf&N+u%psG2cSxp64blwyA_g}D&)4tz- z1xpcV(qT63(wFKKalth6viT_UwEw#{$?1%wcL9abVLVs6_FAQ2B57Oai7kq%(xg(G zw8f}r2&o292mv3n$$Qgf(hpbbY$p&Qk23rec8fYpP&DL^xT?>|GhvM~ap_q*TthZq zPHjh*t+kMfP6tIvhiCiqG>A-AlA~c|9RmOeuA<(G#bXnsI1vduM)z$?aFw)9S)L%n z=ZHdgRn@T~KNy9vgHv8IBf}Y`7_+{1=hQL|9u4kkRl?{bQR&Jq0nOd%k+bvY!NBr% z2pLx&>&SrZP>vB(M11U#3|x^JT(+zkExNB|%efLq0M&(R1E97`WjS*%pBC+jt#<@| z5V&O_&ggWT7-@Y}m<YwkaBT6Bix5y6(Yu=aT<MLaQ`$K3{icdW81?pPqAohL%rDn`1)9HE7BQU!C;#GxG5yj-S3Fa&f3^WjSS ze!5gM*a!d+1&5)#aLB-*_=1Vx8d=yT4iOB>P`M1t^%}A$E(1d)xL1jKqU5~esJR3R zm1w*+R2Q6{4PwZs7$6zSeUg|?j-8clv>UrOn*@^Xyp7Ab0ICdV^mj1LLzS5k1sSs# zu*ExjkFe@oPM#pmQ^Sig>y>uc0HTakJEnAdm1NiyNP-b5cNb0~(A8Q0R&;b;R^tF> z@K@N1(cwCGeE|__-(FK6QsUN-oizN~U_{z&{8YG~2e0WbJVzOzqWh|*-YJ&6&`1;? zB((hP&-V|u?4{$dJnYQ|Ca5c8QXg6fI9=Oz0Kfs(Pp0c>KaT(E9^a2I5hQ)Jp=x}m zXznR)?Agn{ z{P3Zd${ZTAXL{dmLb1kc<}}fDn`@QC5h;B?M_MMA+A2FeM__)O7~^U?2eWVYuy&|thJ(X#bKmm!}=pfQw~+ytNc5{zKp|h z3mr{mJpkJmRRfJ`5>~#ZnFvo~DXgQ}x{>x;O=A{cTFIIO4-z_d+2aBrz*HGV>ym#EI>u{pExiSD#e;Id zRkW4iafA2bXW4t%TBJ)+iVQSja1jg$)t3`0BLXbJ@~~zi#xc||JYa#|%pih-wsb5FS`Nq^7Cb2@0wMc&J9qd7fTM0InhYV_@NW=rT0 zd4&JnlFeUjfl-uM7v6d@g@;?% z_^C61hj2|!Z78dSYGU!Ixn4&$qkta z$efqEUE}N5D_w~BT5b_CedM?M-ArHgM1X|sIp2RkH1_ToL&s|jGOOcbRh3jF1~eS? zXT6uNe|`U_sLGfQF{4dRwW*iMM=(G=GGuYD4df}%;)Hsir*Jz9Tq@}=nSZG10#Ph2 zqtVyM)(M)CURGZ>eDB!IvwwO6UO8COHUhmxo3<4N4P9y9%pM9NlFVNA-DuSN@ggaJ zM*+k^aWa~Gb|z0%QB{B;rD_uFrw$;=$R3%e4AF93L)4TOcAk6i9}Cx zTX#S$E8=;H$Po46Hht)bb15Qo3?2Tu1iv7nfvHr-7_T|!%sk=LF{-L(U-=3plrJ*_ zxy;Pf$8y)>>c|*q!a&tRMt6{u`&9qb+(e~HqA)@N2gE~AWNz+8TeRitwmYWfm@RiE z;ZPS>-rz*~&p@jhd2Fe{&o6oYZTE-kWLFM;IxV(u&gn28yD~4{r*{`YR{Iio%q&Uc zmyR1QjA?vhq-)bCSx{9Op=$9g$|uBFR?q>DDH4I~AQ1EPt2s%=#fkUg$Fba(#n2%) z$0C-|yhLK+UoUadYx0km*y5dCV6~cadDxtIwB}q3pW8nl`xxV)Yo&yf;&ciy5P7Sh zmvRWPD55{BQ->&Z=!o*531}$S&E0_oHQ|6#xs1`0G+84-*VvZrZj6W7o}~OxQXs+J z(Qo52|G3|v6Ao9;HUjQ6$S7u~D<*bd&)x!?9V&Z=9X^%~s!oX!Zs^0;_NyvyQS|Dr z+OH2_cAW0BBoaucIgM-`pL)51D&1eJ-R`mPJBfANl#+d~N1_k~CyIe6ouU-h>6@yX zL4O>dU3Q9XEm71-^*qQB6e85U?gxYQWUP4p4&6{LVe#%A;HY24guBehf{0#EE}gMV z*0vE$=0~<9sZ@DC_s0I(;CYh+2jgA2x^z}QkZ8SH3O4azJ&NNgLjSpL&1bP_s@g9# zxMjbv%Jq|ssXif9iR_KJ(NlAgq&iD`zS zIz#MUP5<((Rdncl%`XxWio3hfARbAf`~Fvetxnb>Dvd=%2PDLrq7sf>r%cRPW@WDm z5z+?{9b@SGKfgcUYpuV2|0Ni7;&L~e`kLbvQ&z#@Tbmgxrk-#+xObE=3ujB1O4@Z7 zhFG<%X>CT5*dmqelq4Brm9lcL{5De#Ftl99PU)mh?;8P_%{8Kus6xcbw6NxWS3#dZ zJr&87Qtr-M!DCi^S=xbp-p?>CTGB^|3wIZd+UkU!QePz9t&dzHp0F3pUEaX4bsj(R z_>pO9ClN~UY{R)y3+^7)K&R@sRBdDn2BC;74Gi@XQPnwg2H`r#oZ}jEj4Qq$LBH0y zaFWA~X11=-)T`fS%Q=!cOU?;VK}lK+SPE)Q6fqH53&A_HD{v{eVk;Ec6`sD3Rya=2 zHtrtD!i3KM#sEF{Nd-yzV=C9*R`@V|Z41H>X}D9*>665EI0b?$kHc~;{dl)^V|8-{ z5$eyHQjwqN?T)LM8HwUsljo!ht+KN4tR$jaaam7 zOXOS6w_2fYBO^siZrfd3^hX*KM`TzauxX_#GCFlze_Icnf6GeJoe;lBTSnh6?@S<= zf%-Af#dA?ev46R}YZ0=y<&dd*4UO&(F{Udz0f^{G z`%!6nsj0dmGhRRR>-+P2@$>%tOQE2c`y6(;4;d;`I0c#jrCL55u|whIE@eHAZ~mvW zzk8e{N$rUygWFtnEj=sYCfR_hh{i4??6A=P|OG9cX(<{!=cNAKr5ecP6p7Zm61i5kh(7 zg=qp{c}?yknLVOZ2ZzWV{#k`Obd2#UTZoJ?=e({tulSntdR=qQdChr^sWCe+lrD6q zsX2%F3>0U>)NI5h6xwq)R;p4HTqWu)W|RTfph0xyO-WWPwx(0`|u-hc+T7UPmv~M-+LMOtq(q zYeWptj_c0$pphbshQ`s*qi-s*VATpO1dybeL_*RXq#2j%$N0Yez4*ELz3_3lm)|bS zXxTzQNHGd>LK6U7P%|;(a(CvmX*E|BgV!f8Djz=P-=DS2-*3J@bjnbj%AwQ|!^fhM zHue+Y92&E~K~OcRe{qSC)G}1(xTcB(^205nGHel+6+?5-okM&C2aYDQvGZ4fWW`0Y zO+!*2WQ-S!jd`0d_uKt8UnB)4fXe8O%OQzWk1F4o2o&msvoROC{bQK=Ad6bDleR;4 zL-ccN;DKxkyL3LetJe=8p!NB|bO5l%t6R%oiTa%yt8X3zha3)m`|na99d#bz2%oa5 zGJ5(1NAh<9<|jZn_^SS<>8n1aaw5ImjkDLL-{H}Zb*s{%p>jD0>34|J%ghk*dPY>%=_1wfFsxHz4kI4R`gSbI7GIp=OQIPM2o5 zS`6tyHc{e{Nz{O$+6J*B$O_O(Yr8}JVp@TyL(atC$r`f%2H4EnK9#vd+ zyJZ0FGv(n^51O3phVR}5JybY zDfHP!CRsG8_F6dcog~J}eo@QZfS6imF}u!OYlRU?;dxzOzy2KKinh1c^?H5%dR?#U zny=UOdR_Cn<`{Df9YeC07XmfSLGu+;06n`=8DVR!z)#UtAQCGq*tQw#CNH_AI?E{) zFqGJ(8XiRkpoRi#^pn|~Lo}jEkyZ-PdnCaD;<>k8*_E;((Xw4BA(&H*X`+lS14K?0 zkl>IkN7RS|7E%S8;WmD5e;dC){9bt9eBZnsx3jWp)&8*(4xwF%!|O~@z7~msrd+86 z-OZfKxQy?c-ygo;{{80nn?}ruuPN8W+J!9YqwHmGPaeI?V;_X`_YEr0^eC&17K*+oVuK~d?nME@6P$JuayXw7 zS`=fFf>bF{S!sToU686#DvNtCKzR*KSY=n)S{iBecBburd{wsMbht;n^F(9Eqz>-G zd|2wzOy%RM(EjI}qXO=D#es_AaA)r3Almu{D;<}CQGMSJy!i6tbN+tQ6+#|Lvs1Fg ztT)`$7yjLQoj;dog~Txa5y@9xEt?}mK$M@IX@=scoS++<mGF>kA5T0hD>6>#5wG1nup)|#7g7_+^kuZB?xJ<4${YcJj`M|TzmgaLGRNfg zwGd5=apO#vhlwhFnAD)Jt`Uj$ntv*sCh$^;OAPPlf(afzA=F zpT`>a{WiZp_HnwYt+8I?mkNitLP-t(*2W=2h>Y1gd57)AQkj>hMRLPrfaiOM*NdxR zDN2EqU5>ju)m9lQ;7DRU&5L)1V;wbwsF^v-uYO2Wey724xya1J7XiGX&cZx2QBNVR#-wZTSUcx zKA@UnIRJM{D-d-Lz|bMt^L9?1V~jbk>v~tP)b7EXz|x5;q8!ixBA6r?NUYmGH@|QHzWw{d?;G!>_u`6b!E|>yEzCRO zLCedi+OAk4mMb4wiMMFbZdk^9`TOSYk9~jhU%&nL2eHw-cLC~7DAweKpIVJHvW>Fox!cCPe{OOkds~bPE7QKF^@w<)Nb2N+k3}$Rb6zU zX#n?=*7~4~{yk2UYq|HhA%@!9}@+Bs};h zcUGP(s%)8gL8BWzL>LmK=|I+pLr|4z^0>&MB1-6pO{z}`%fEZl?Q(a4CuD;IDJqCN>wzK|lTJv~Rh7s)QP`0WasX+?9jw+h%rSFGu@|YG^>e4E z!)`*IhcDu&KAY`I3zk=za%&TECp!w>pfs9Io}D6!ZAXG^=rXVEkPpj{9I&#T^v*#; zM)A6P5~%}2c7t~jkt+12YgX!X6ohuyab(;><`pS4?9<A1)%}n%8y3Ow8Bo>$+aA z>-F{Z_4Nt@>vdgI=N!ifACgLl8R@D@Gk2G<{PyMOH&fRaU8=cW4quuTymNqIf@0gRXrl#ovY|+t!*w? zj8`@iie25EKGNMBx)Bypb&?ukBE2wrJJrX9;4u3ke=9AuhybHP&`hi6_Kv0uMmpBb zb=&*n-=Fn;>&9$X3QnX2x4h-tjq@tIiJK9N+5Gvf<;08DS-1htC z|9tyxm@2R3zi<8ZlCMi%gI@!4V2~3~P@LM$*#UvZd~_&+|DP(_+kzzd8mbhyyHXuP zDw4?@7zcv=g8*~L95NKIDVH)jKBrXI;f`qiweIy^{xL4lRha{!Dkdqjmg1|RBOO-5 zJViFT*{o5h&&!6ydsIu0O+xL~XGBfyI7Cg&s5kzqq@oK&B)ep8Ky+%XF zK!P$eY@5Dwg-4svpLx6o8rW54d0&0o*^RY7G1CL%hxx%z`QVQx&5%kol2D|9zWK<58!T;x{qzUhQCob&wD3Mf~xC~pU>x+ z8SG8*01)vn^K7o`TR;(Yv~^nu_6ku5m?Mha0F{qOVnefVu;No9jbtV z(5Ocg^pMnZ|L5i_6X~SxdZ3J~_AWj3SR(FjNLgeJF_enGR53&}xLPK{+9d6R6aIiV0i}fl^cCX3>BA@f^Q*R6u(Gx z!$UQph+VY351*JjQ#dZjTIA!X<;OM3Nq(84IgGg?uWs=fK6~fCD~$52VUV68g@Rnz zml5P#?urV=GY{yS%FhK!&Z#<2cxNqB7ufQk83X2Y&nVm{Oc41;7cYC5J2@7ZAg$)d z#PA%|adeUc@cQ-j>+9>+AHTl7zFuFi*X#Ovys@iv? zI^yWMDytI~shR>Tj@VD;bhD9pOS7S-8Aq9m#{}enM${-j%y+BIoj~2iYKaqMCclRg z-p9wIfUsx$&X=_nVH?!lzBltnZQ*~0$*dg{yedOUfiz?ksvQay^6bwh!Kno~9TJJ37=%2-YacSA4lMnC3 z_Ni@xsz26w*qRzXJm_=BH@15KFqD|Mk6}l><$x-1KH}Y-I{Cj~&*Y${QV$N~NC0%z zK{0axLCrP|5r3uCJ-A73Dj3CM{`k-xv9%1V_#6V&M(xZS9=7c9R$(JfP!&o~V-z5T z6gP<|%btayShcVfk=-!T%;K#|DQR=U}% z^opJTi6S}TnFl<)-S1$^QDu@UDtbj(R&-P#$&hY@E>lpfGK-besRNTke#Kdq7}^UJ zkvXo<{I$#+evPkR*B@WkAJ_HknqSv=jd`h#L@t|nCIQi@(BZgVBC6N8uKWEO^D|%X z^?r@_YyAGqd9TmC?7lyUE{^Wt5Z8gL8;5%JN6y?C>##I6P<*1aU?q1@XaKcWG`k4J zVo^2`R@iOFCkf~F7{Fw=gFnm&AcolOkT6e3c0JAh#RcdpJRx%An`CpK@`Wh45|7(N z0P~RYRz!K6pvsm2$XR;XZm+)bvQ@?)yNPS)(-EULddf#vKtusUzjtQ|8S}_Rh7MPA zlsVcd+Wpa%z}aK|r54#S$Na}1fBf?w|NQ4a{_*S2KVH9nU0<)SudiRfz5-mmUaxsw z*O()_yNk#mOFk9o%GEitZ#>mK;F606j54Z$!`#e=tzpC6r@Jk8RiiVcTLY-~B+V#H zX%GpxhHtkj`bfTrsVS7jq=qy{Yxs5>;p*y_td%c!_xrZB`2P0yhyVKRe|>D3 z7}cSr@!7$>)U8Mjv66i<56d?MS$9L#7>^Ul?ry#qJq_#ZQQZe2?rIcs-j0v^$MC*% znSM?AH903#`I<686~Aa!mI+5YK=cnKSeSDYz{ z3R*f6rraz3*v!-8eh(akBdU0$c$(EJ?eBR^yHjUnmpZP_fjKIV*Poxwt@i0RE#Ymw zA3E$V@yJeS6`Ru9uCf=bjy&<@KR&tPW2SEo6VYxP2PoWNG;D-3a%5TY+txU>AS5k2 zF?$ZXFv})BS$1vaz7})lS^5Vi2#dE9N_E@|);d!dQDu&7r!*kc@CrSX08Mw~J%ylv z*kHYDPGxW7%|_NX@apL1W$27d1QD%jMz(I(a(s^s=Jl>xr6<8g>X;(>swEFmtcZ;9 zn)-*i5k7Rj=C5C`KVH|bukpvw*U+ii{khZiTNfh07%?tZ=9qKnjJYUx)QIW(zTWFS z@6UkVaxYnHaoq-Y1C_J#pQ!YR*2!y=A)BkouE|n^H*1NjE}gB-I<_1trj+cY^~`=9 zCMOU@6`h^c7#&tI0PH{$ztnS0b05V$*$hXHJ`!OI6PMJ7*3+&7(DInOY0VH$(G@gkI3xNUBC3tbqhYnaCSs9BlC;1`8@H`h}VfsH%EYQ6Tu;D*OoK zo+Bbd)g%yAfUjR)|M=%W|I0uA`R5;h{`u>VKY#uD^VhGhuh;AA>-CCs;We-8n%5j7 z>eu2?c`{g`&og&YwMqr6rjNtj!~{^#Rfm|XOpW921~Ux0nW~S}1yng;q!hrnbQ?m4N4GHJGOQ2R;^+3?-}d`szd!3< zm9$FVvHSZot9o*>T=kNzJIJL}5ssh>HGO_~mY6{9;b6-|vMnkkI`&05aPZH;_M73? zlzaHsORft}f4N*kyL`BEtuiuzbAby~W5S{U;#AH75;WRyPRC1B^flBhraR*`^cqxg z70jxcQtI=ljLfLpMdH7yPZzjoIaAG?JOwD>Q;6*b1sdcQ9)kO`1=>} zO+t$T4AIHwmvGnIgqPtk6u8%(u zW3B}%#(Fw1mUnC*e7LcLFp$d1{w%0uQ^|bZ=i_Fx`4B?~VkzKR0hyvNp_{oavpc)? zL}id?hiJ3q_nuWsU(d30PhL3pO4cr`OqEP%=p5sf;@s$=qGPBGRmxORuaTL(9G!>m zEqI0n$#_I{XH>#QIO8jG_}HNkK*5Nn!$XH+3PzK*b;z&*Ms}7cb`=7_b-i%7_Lsii z`d;G>fTcRG@%p;{cwMh+zUFml0IZJ6noz7moAbLw$n0CF_s}`!XG|SB-g3_na>?hd z@&OlP(3?|x8injFmd7Y$>AU4@34!XYw)<=5Fu`ju^ZqzNZJ{Nn<8I#O*v#Qen?=|& zM}BNqG??3R&lBZthC5n(30kgI(F*8UZ&3y#dVmF;Ea|JxLcbW#7dIX)G(yHp(#%sP z?)}j*&lue=300sF_ubN`(-v)uqB^DypB8hSgWKp7YS=r1P#@zK(;!48$s9%TmWR~6z)+3T z?gS#vbG_|Wr;@p?o1PlJ+L$PQfk%}~I|n7K>7llkWN_!zXkMBn-7N?+&C~HvM=F_6 zFT122Ehkk?k(fZ}4l~?_&*HuC{pR1DLR)>T}So> z7OHZRqK;vN50Tf<_f(%^OWZ|=s9@CW?VyyR$-)er2RNMW3$#>gmSUk!sH#kfMmrKp zu!iEO_QlYcNfPVjuG(S>*{OZ>)8E zGdrky79#8m>HKN>E%s++$`;umCnwu?#xLfU#W;&<)U(`fvt_m{Izn@qt(-QNHri=) zm>HMbTIO!|9j|ABtvddi}UvtdYe9d`X^BVK&xwR@9d9;?zv@Pg<8MWG@bP#Zb@XaFq8?5%`YisOr4z>uJv zV(BO%szc{BulQ$#NPAbp;N^RfS_oQNbbj?2te7RG!|W)k|AXSnBW6_HAR%(;UT-&&q5?eybiY9+6DSB%&5tyW{ zYy6ofF(`09>ETD0qvL5Joh?;lKmhUV=`AThkr?;WA*31>YKDQ-UjFs#*MIrPKmPIO zpMU=G=O2Ik`t`>jzyA0m(A8CY>XjWv$C%|(5lsi61Lg|~_;7+6om1TDTIW|p-HbwV zh`YE^hr6r0GTKI%>+K_2jhfj~H8VBW=$R!jr#R;roWpIoDlc^xyTlf5B{fPvM8va~ zV>Z7n@!we~Ep4L@`(8k%9ZK2HXe%qCA(+d2WQ=N$mqb2IsiL7lt(yG;Qcav{z9%Jp zlc(=tyM}TD>8=8$MOTdEfpT6>Un^^@Pd?tQo|-95`99aKvcv$ zrUR|zxBDVj*tl#qCZSv$qO+zGDG96Un9NmE9Oj~mK{Vvf_O55zD^o)0bvoJf_^N=Q z@OwQ1N_LDDksb!n+oghpZ8fATY)^!O{=?$-!(xS?tBZibD5m26RAZe@3p*dTFXP~l zT00_LwbUQ`#8_pdGq7eE^XDbYks^5>S=kwf;<3*6uQOI~s%*f&Wxx6glez2Vh{Q^y zPquobd|TaV-O9mmRTqLE*zzo1Jg7LSC6-9pOZAeiET6eWSEzg4?xD1@oLgr0vDIy+ z7yVxA4&;<`Jra}!I5xNYw)MGr`}_U*yg#4M=kxxob(`6Jzf;{sagm`KiyfrFHRsSd z=e(}h99elj=bYmbQ4AT`Zc*BVMR`{U9y;1r6%FNP5(+(j2oMU4F!#4}5e{(yhssbJ zVqcffVM9I$ZyQx+8vzF^kib1?W71@ht8ovLBdza@jkYQd|@A-B1pqQO$JG!F$J8!VL~hedLfg)lFu*x^kfo3xZw zgtsk8AO4Q0+K`@n+OZ~&(Vk7zLr7{L{^;cCE@LD}?ZiTJ?Gezch|7?IagCm$P*inA zE+v_^O|V_B*B^gIV(^bY{`ljMU-9+z_4ReVt~sxfz-o-4bIwrO*Q$){iKLToCX1Jl zS?N@oTf!_=bRSUHFcIP=uI?05PiBJjrDF`UWu|V~+ZMiT(ZNAe({ZVC#OVYS6)K%; znoIs@XINHK$m7u-rgy(;dw>MB?p{R$Wt!9Z<-?0U(jL0*u0$%c>~*r6LMv)WvdBYH zOWM7>N?>@9C^$4Q@^DaHLlFa>jk27#xtTE=j^=mL01KIstjXv4O{Lvv$^PU8W7+rvVAX= zSrYb>^6(}f1f=Bp3Lr=U5P+OBEnBk?J%y{(z75XqfZSaHgrq2U=ScvF`k&+sQx00l zvE;qTkrXG`YUr?Q&t zxN+8r>-Hrz;m-5!4@*`BW0kfu>w&DcmfvgnTKBTG7MHEH)^ZO-b+7w2yR(?kmRZz} z6XxZ!*L}a=_vicV@Aa?${QV#Q^I!k-KmPTf|N855-?o;myP7oAy~)T<<}pY{6-;j< zq9Hm`opWBI(e_q`$c%iM%*;55#ys|7yD%ih#;P*Mj7Grm{$oJlj#9Xb0~|W8`E`w7 z*SKESuMo$CVnzf*l-a`=k+aXk)@J&nmyw4=;y-p&>_=M`<0LiKBRSmo3eT z=HL)KEMBr+u_2_&{)*~$QfqBA#WV_7$v(n`w_PrqgRR_(GP#0Bnkgb7U3IuRJVzkL z^I&Zo9g3AXJ9M!ZAS&0_>(?I%sa{{NP+h&Q*DDlP*9>^2A-y_aU0krL3bS-AM>uAJ zTeBI2D76Bm8ahqSq0n)0?sPS$G6iGe9Hu72hg)R47EMIypwT8rbf?ss6{AXMBx9NF zTFNdRb<_Ra`4a(q@3FltJ0h(IoVjmNsj!;T^WM5CmN#$e$JUD1oXlnC>vzO@0`(%m zo=&61S03FlAB0G@v&jUsv+FOB0*iPYsQgU1g|3T;V~U(-(ARX*0$Jr6RjeA}=2>yOv6oLXD zLWmQta8~cGK&z@+j8w3JIEcRU=&f+jT>2xdpFEz^}LVBRhG*eNl zdPeR+Ub)*^%hy^TTkB)@`(F22_p*Dfwd}TK<^hhD<<8C`@_KfX)#;iV;AQuFegEtG zfB!%JnBna#hCKsh2KU2_F! zI>yiuVVsnS50exJb_}JMz;y_tR4lqojVs)g3~gRPQ!aKC-xqhSs$Lp z+zo;;hN{kag~UvtRNaNaDeX>XZr^;ItWmup%f7+sw(j)_HgT=>{@js?jY@>Ia;k50 zpJzPfw9G|CUZw_nS1a<`v}~g;sI*xTVDOmCoq$~-h%RS~+raRrl7tO+{dG4d$q&-QgtV5>$&gszULaIbM za3bkiKd*Q)4p|oBMZYB^9T~hDJhG@YgDi&<)QmxzmtihzN^aH5HtV^EvuZM;#%}1< zEoTE`G)?1XPNQ_OYpR~ghl^BrukB1r#zWs>y71vQgc`+zBefDGok++IBWlJfn6Vn7 zY&Z(2bH)QybD%|e9~z>WhgfyHxsCQUzOINvoMHhDF$M>855lp|jY(=sET@Mtzls}NcQ3um7#Ma z5gY`K8}ZlyXH zq9|4OaIBs*qB}@2SGTkP9&s6ss_rBD4oBTEeTbS3PW1^h+VpWRk(ttEO{H0A4?LuE zoh}v}<^{g13Q!5n&hs?)iAQK0p0Co@o%&!FjiIDi?M1SjVq|}ud?KCK4( zUe72npJgH=X`<#8DifS+@edo!YIg4iSkD}&jgbLH`P8apFTS;gedx*dVPAj21Gxpo`;T+E|8SUDM>?@Wn?{gmlI1227delPwZC zP4K_@PdR_F&w55b4?BB6El5Uh)l0{ZJ4K=5lg~c%VSjt@c@R7G`#j&C$-#B6&-=bV zpU-{Yzwh6m|wvTk#dn zu}viKu3z|R&uIj+1m8$RxAkaNNA}0@qLDgUy zdt%_j@pAiwl64$zJ&~$xmZLTe+San4M}-l2Iw~ycbX)z4$5r6TB-FJvivt{{=kYhv zP@}-_?%Y$Fj{-v2D)IKo6~jskm=Zf4QmWp4B*=vn@MeCD<(sH1zlmKCS%iekEijxq+Y8tIE``TAb(@6Y|Y z*Zcmwm+d^DKt-qO&;Uz1$GCJ%9U4DWb$4<9i+_E-KmX&u|HuFGzy8vuP+T>P8v>V)Q>&0JV7S| zLokZ0l)`IlpH7icF^v|Pa2O0?mj=Yobk}6|*2+X)q-H}6RXp!LK5SyOr}P#L#fofD ztz-&f?E27ngD|>1Ed|{dA>=spgiMiT>LQ)u*BP~&L+O|hhhz;GT}9`dS16Y96G5j7 zl?bGs57tFgGQ+;RKhWtTcV^NzuAW?{d3LZajslELRkLu)tuzT<{%@-RHcvb>XscIt zw;IytC{TNO@_uqEI)=tGgyaS}`=CSyc7 z`Y*yoUEH|n%Bhyk4h!JM@_KaG^2o*3*ytc%%Y2nABE;_Vvpy+-u$yjh7$xNRDr4$( z>Fd(ye=`GM6@OU$J0XQ067N=!67`j(q{QPy%F%Q2i16|dRm{jDsM8NsIx)9%<>Iz^ zFXO+-l@xAe3~9i(nVs#vGrf;IW@G5)WUl6#jmPLe9k zLlDGUBwG&XP-wND@iBQL*RG&t9LIDaIDCmW@hm`<7G-)v^eD|dk&)NcrpoYmfSyyJ z6M~d3{|83J5eHQ`a{M4~Ewn5I%`3Mt#iUK$5Q?8~+rlUg_H@TfrNXHPJ>Mp0+-5&Ri z75Nthk=ukAloa6rksgnCHM`?Lh%K{48)FQ}fb8sXWQzi{RVV`$aWhd} zYyI+H)2EruIj=C0?&^Mxp#suZeckuH*2jHCCn^cEuF+UplkcgV-RpY2<`uoIwDeUQ zW&>~vW7LTYM|HU^%TPNlW6Lu5!ec?BGgI#_-2$XkBbh=+*aSR*yz!mg|eb@CzyfA?sXwo8sDT{nQ7=J zZmK5L8BK;jaFcOTr?JMM#$pj*p({*53Q9pCBd`j7DJ`Ir6lO;g(V=62*+e%vjmRM6 zZY|&z;zd&r=a-H-^Z=5_7w=AzR0d%@`&Y zk%se)`76&|o}Jx{tspy4zA%wi@2KLQ4gpmMLYvy;vDXE%k=rJocSbe%L6rGyt5 zZ8WQ~Q)y`wROm2A7xFz(Dqo?hqKxAW1ztFh-^{{BhQyft%A%h^dn z#muJv@NjWC0l9wkYVXTyx`*c7Gt+?*ppbQJMGq!* zAE?Mp9aq4ycT~-?eGu&Dj%u`fq{)HottWlK`Pk}8T1NPzA$r+fvY=AbU4?YwbV4Gs z+6C9a@AUIZ&mrfZ+9E?W6pWaYrf~0V_er9BSH&{A_TMhzVEy16V`n%yO-O7o6@I*(smFs z$9TP7bIu_u0r4yqllSMo=jSt;%ZS=4Pf4;=XR~bv_A|=V=Anq#M)hEZ+q$*9XD=f} zRSA*k;tmyYF~bN-BgFP2@-|VXsnC&$V1ei%eUQ#+K(d0b(k-&(0hMV;jZ|q$!ejCL z;m!jzGSkR`mz~=f1^cAe94BV6B0a<{WzwrI)v!OLBi8V#BRJPCKCL<8Q%4swc!8)U z+!CZEl~Zjjll15?13gFN%%j8(Wi!VjGXRz%FnI|>AyF8#9Z8&)(`9DwfHA5D!-a&a zBY2O>(I+SeoYF-HQICxkF)Az)o)T@;+*DPWu}R6Q-K%L?n5@d0Cy_yMfl$N+&@pr_ z``mWl>!#lZUOE*@5yiN4%yC`%n))@yR2iufj`~4JO!5n~b&@d$O(iX{Md5aoMyUAy z;=(#7fqX>RzH}SRo?4&XcuL!}Y5ZW0VuzhPr8MZ7JI=T|r(R%PWii6EKQc!ML2n!tD$DocDjq!Ec?%`zO2f z{7Fda*bz4qY}E}mxZRLXbUYqZep(9@_;hu0%3S_-HT~B|9EkSI4+U2`ya5r722^v* zkXTKuiKQA!cU{YVz1|90pL^X7!5Cv)(Xj5M+W?5Uk4$-|iOIlElOV1= zaAXYIs7Yx-Gv$Alu#TN6R z&-c;Ir76SGfquP7Vc$*u_9lbbR-Bx@W8!DN2QM}g+~=UXoE%#B(3~b1mimKKUUf&b zt*uG2FnUSihciN%`1tvq<|Bb>{&lq$U@~im<~?hcGOL-%xgdD2>+9=vU9TBmW9U#B z(FQg{Rd=(MlMt5O(Ou4smU2h;wcI`JBMJEX{rf-u1EAUZyx;Hl_xJC=e*gackKcd% z5j{tLeMRqvuh(_WIorDjf0EyKVmgmXKaON0&*1d$kgHCI=f5g!h@2sS(7Ds>w)MF` z@9)39zrTO~{{H^{{r-NxKli#dmVqx>9{HaokQo;F+{}`*?rBkdoCrDzNhOE?@gC0uJ zoW~oJXBfCDyDKLV0s>LgM;9jyw9uejScYqG4yaI5GE-q)$(Sl9tt(ZYnq-TBp48v` ztoOY>Ykk5}EXUBHqEsC+FP&4bsjsOM(f%h}GsIyyGjyF#Nbmp5KcmWZD)`>~d^Ro? zQBRf?+n38Wlm%X-_s}L*PX=IbQr)kwgwx?v8bjB`H7S=w?a?x>-nDKfH#SAco*3O9 z^z%B<8V|Dg|F#WMV6E1X#|O36DjWvXw^8otKy`SIbJe$pA77pGIq$0dOv1KgL9vDT zJNS80Zqc+q$Y`w(-MP)Wc@jU&M=ZG)8LwotKnvkH{v{}lqMmm*xbv~HqLhj{THkae;N;ZHr!jrNH|+SQo%rsg&(M}2 z`-;TZ2sOjzVl|{x?baGl3U)uHlH&Frt;^QBhcqSJt}iG((L&;R~E=5@Wke*O99pa1;lKmYvm&wu>mAOHO4KmYjS*B`(B_t=V_Hui#8YMkwMj8hI)l-uxGMPQy=GO( zzv3c}%tAX2PPScS}1H8k|)S;s{je2kv+p~ZWXcls&xB^lw zkm~Fj;lv_M3S@Q0CKve!jTby`uu3TwtHDg^Y^6L8fuZ^udQHrMF&NiE5wCtu=^4|J z3mBa!#Lb;zrD2W554C0@suIdNIsir(Zjam~6_9niQQWZ>Z{xc7nm!d%Wr&Xp9Y6=$XVh}yk^=XA z^~I_kq?crJ=V8qsiJoSm8kwcL%GHZIF2{PtNT*xc?_JoWYL4;a_tAn)+xJSAr0pO} zMWUI`yv85;wQPyVHD;^RhmLDpuj{&Iw0*jw2|M=`2to7$ps!^JAvyPkL5F+)D-Fg3LwQpX|b%flAL!tc352Va?k6My2)m%KyYyjiwV$8>&vW)~SnRs0{Jwyi)Tz#Lge>st#xna0 zNvLNp+VC~uw8xm)U^I#fuQ|sMNm4oMBcnOU7}3~$h+fxJ9g#QE7yz1orBgEHA2P3a zjUa7=R_BQl{B7xA@ICRA-8`Cx*jj7dpU?ZgSKz7l`}_TQe}8|!KcDya`}4W)6>S|V zR(!^^xzx3Go*f_Md9Du{AVE0fVE=?iPr2F{q(ujBbhG?jgD&nKgOe&ssFT%&*it&F zc0%QX5$({rva=49GdeLxFNIRQ22UCLOBJRfCW7poa6s)?9ip;<5?OdHVzk2B_TuoN zm_z2!D+r!3j=tgQj9EQmpbLy*#G-#pmcuL(l`h$srqk@f+Bly+C~n(h#tlKh;-D=d zxtxn`F29V|kg2$a42LR2F`~xL;uQ5r#_Ye1+Byt;4KsH&kgTj`c zwZUx!k4#V$>~Aulvk{p;rieOr>zyOFhf zzwh*!nAk5k8wyt}d!%>DVZ=ITyOz!?$zGk@ES1-&#K*SUJLi}RGvJ4D4X_=#%csF)aSS0bVhpn)I;o7IL$lXrc5e~^)DKcB z!<-_70%HMak>F$PE1k6ng0xVmy z0CK1}0BW`Nq%AXFUR~VFN2Nwkd*7ojH46hJH}5g{vNz}PeP*!&HiKe@73lyc0dv2N zx6`R>F-A=;~H4bS&ci! z2z5)mQ<7KN)fK!+qopYl72#aI=(hj^x)ZUgU7N}nFc5=RbFk621bqlIjSJAdN~O;Y z_h7hq9Q6YLJqr+?kn?ylXXgF!m^vn}3DbRsdpmW>mrE5)Z?tsS(6Y#x;MLuzx0UOx z0HI!8r6aoEstDQsZU?lZH`e~t=lx_lQ;zG4AVZ1{L8RI6<7}UpvJXIfTa~PdWzQY| z1KTAKi;k>KETeL}b@3-#6@S;!axSTN9ah54DvEiS?AADU3%cCEc|#G-3{^(&7-bHp z8AHjj0Mbj3den@7^b|e{Idq74=4#3%Ct%6^NOhA;G3B|(Dt_xgjSS<~AxSM!dsZS@ zp56G(-7-yF96(j+Y+@wbi)%$m$(_s>)%PWGN`%dhUfR*czIvd(W?U*0fsQQq zw%9R4NgxlV#1pX>WtGIIq%=hKr*x`O^3h8VtSReqw5zC$p{Q(w(Udfj1+Qb)XI2hO zaJG7i+z^2)EoGa?p468C!mkn*|(29;ATm{1TyiHoVB_Z9|-Ge2UgM z&sW@qwsSZ-%8z5)Y`atxw^p*dd^!&+r#SvIY&(uc?4Uv_4nZEv>g05$z2V3Hf8Nq# z4dm}XAWcqJaYhA)LF+efaoK6{dcWxo=JyVk-jw?zq#BB4keTb8aZ+_yEHiS1*4@Op z9)A%rnRG=$mRy5ov$|M)U&6NA?6>b7*duNFru*4xj1ekV%ncCZ83zJ-Vj1?`?*kae zdEIb#QyaF%m}d7H*O)Vl|04VCB;2EC-E#MsJ+_RVZJWw$kxDIrK^|opZ8?ETm6kQB z1FL$weir`v@cQj^`I>rZbn%r4b{4rP?s9+l`^H~y`TpQGc-pR!4XG%M{{N)8r9FdY zIj&+5bf{|h_T)bR(Gd;1%&|m%-@IKe$~AZ~CVxOy4(2K?XHaV}hf`MysR<8mX1XG*@S+OQS`p}GM@zhxV`334!!+~%x!`(oK%Fd?^W^6l_Hx`3 zHMqI$=|_@kr?BdY?NXE~e>-XT_D>HqA`dIPw`5~VXd})1mgO$u zg!oXUx{M(zs(aoR!RSz)8HS;ozXFRjKf#uC&XllZoF#iZrU-l2X`g|6VBEmy(Zl0- za7lU=J$5vSDTVlh&CCtP3XuzyqVVaCDO;UzU}_$^b!o>+D&QjLd!4zbdVu+pc6-_m zteZ7#m!FA@9VQ)ldO0?BT85e|D0_oS^Qd+4g55V69l`Vw{DBf`dn2?n&lpWQ4B5VP zD8k#ah^PshrI>jngO5zXNcyFzLn^^zx^E@Mus@|%jJ`P_jsP=j4 zgx8?}>upYEfapAgo@G0m&?~=E&Ek*$KWY|O)-S%7h+)XSk$tGKO;7nL9P$J}Kywke z4#g5x3m+bmRUEE6b>^fq8aca}n`QW?f>7lJpsK?Y?RcZ3e&^h|Z5lHT<`g>p;{c4j zZ~1-U*TvT*Gj#Fp{Cj7swjr4@id1=Z^mS$Js7G1pO;)5jCNJgu04Vqb6a*t zBj%dcl`{uO<8x1r0M#)!ZD=5)Q4PyPs}wY1!E*!b_^S8%#uaVjr9wB|8s6YYy&Dw= zwOX)VvQtr7)Yy^UHYLB2=1S@lew;vd5OL^Sz+(^RAA2$Tr$MiL=xN7Fme_pivy0Wf z|Mcz0q8tg%Mw352)SrRN0c^N!eOjY!VGonaYH6_%(K*ziY=Pj}lpz&byAY;8T_w36 z^jJoS#m!V8#iKQ#aSJpYv+?Onc4^?;N(9gYcFpS`u)AiEnI>s0> zMv;hBfK%B9g#d1~4?5bbCI~!sL_+8sfwjkrC9LAsQ+rtsc$#OoEeLps*oUEzf2xoWr-zwVZSuBaPNb1n@xwGHABDe5!o7H?)4Ea7{ zxhb@D`WZKrc;CBTcoT#??kM+?^YHDp-Rq+dFWxvg=jQA)+^+jabBcPv^Va&Cc)}6#xl<2L;y|4Q;nLyB-e&b#xorLPyNyfao#R>~AW+p9@1ae= zB;j}5V_AX9!UnyZtl=Z>RN_P!_0W6KdvFN~4sH-49BQJj1)g?|{dU?~GDHPSul4)4Y}SjP>pCnDt>lc)5;O8=CVt zBtXp;IhU)SZ>>v5EcLl(d{w(!WfNX1E)my3_B@U)i_FKhq_ASoRf{7aW1}@{YI`JR zmPVj16psN1kj#=FUer29=^+RpN}3iwg~&2@!p-j`fBn{97hjXtm2)y9$G@CL+_%4P zdw=k~*86sMp(x-p>mp?2AoxzF3q-nOU$o5ylD;ZuPK5Y^IoCnF5*q@6zcm|JMCg?C zRg@-(EQ{@w*<%rknhuV|nH@(%wOBnQ-Q9h`0e{mm)QI7Td5Koq{0zCmBXt8usccJ> zdX6DFrpTa+i`U3989K`8`~)n|Y<)l7Bx6XnfL?@7i{ue%P=M?p=sZ%~TeD0QQyh5k ztoy?@vA%=;GhoWM|%a8A}GsL1`c?n zLpF3e1Ti3y{Ota_LIpURQ6Ew4|D}04%q}ZfC>rXBI1^L1aEFZ+m@{eVPJ76L!uEE@ zCA!&K>$B_=4czW~eb&8ftpzg!EQGI9?UGN9HXh>|YBuNa>0@43end8MDR+#}Y)#T+ z=QyzmIs)xn1G^(@0Q1pnNiR}JA!YQc@mG9I`MmS_cB;2N?W7X6aQ?(J=9 zm$5#J3Ts8Zn?g0lA|+C@Qd9Kuk7}yfj*nB6zI8XxZdmOY)4FZLFMYCOMM~JnB0QxA zW*ZhZS=7LPmHQDM{(yJLe^j zzQ~EJc0lovF>vpmV|N^7JuM$A5m08{Wxw}%r^kV>0*S26-KL`pW5S5B;ti30*t?jl zc77Y&=h{j=&4g3ATYGLny{4-+kBg3ImsQ8Ktz5h%D{|F-4`d6IC~xZ+;Jluq#LENj zNU7Pe!_4-BJ}h(_bKAI%$GD9R=MEO5^XkZ6?yR|XeVX^P%8)Myy=!xM!6YywV$81M zee9EXJ0Rgkp7}lkk>wQdv-mIZ5%b425keNIlg=1l4s&?QbaOpjVn_v}17~vFQcNxh z(AYEFX`c3@SeQ~S#5p~V1q5m_Qn|)sZe6_?g2hr71ku%(A%$h4uuP`a+EBW46pImW1mE2oJ*kARaR(Gh1SzN;Pt zZR2aVnY1lSw-G>Pw}oUEEl2NcM%RfVz77i&r{=870-E|k4wjP6g}0Qbt;7MmG6*~3 zy7Yns`hxQPYq)Ts{=+Lsd~OZ;uGjU+sV*GnaeBslwcGRj>BBeWaVm6GnS)r#LpKE= zhK=%XW(#P(F&|Qg*84*wJy4ox7BGRP; zCI*echvgLA+n_?#2rm<@oqnjEL770Q+Jv2$%fG5=0VuA%*?&0#+3t0|DN>e&mFz+; zDK_8j9OJiIJEy3|g9ycbOz}tBWLwvn^l*(Gsi#|zAPKn}FgNLP^l*=I+j+(_tbeP>PV^X3Kriq8&&#-<~?; zDC-D1Yp6u)x-o|8RE6rG&P>^;xsNfXCU(}J3sXk#u+SA)1{vJYn-%IELJ&{Y>dyQ2 zGbJ19?4|{$i8~SzJIpvT0^MSyXo^;}@gZ+9tuK4F?)iVO*X#P4 zuk~85oU3+`A{aCa+6l3+IoFt#8_9i@4?Vz3I+Hvn{_Oh|$C*xn_w*_X6QC*a^$a#40w zV4t63-*z28CAqLXB|V&JJA+Mw#BK1fcKyp!4R@UPwA$50ur6Z1Lu0f(L!$1h+131u zO8&%0coR{5%FCk5`Cy+rAF}(7hC3nv5A@b3Z5x){1FY6ZEOeoXjkX6p08K}koAcO_ zR-M*D?8R~)!H?|>=20|Xi-WDj)IoXK_xwLGQ76==Cj z?9(g&MlaCW(PopFqG0tY>4+?$GWz&dQn)Xma=#B5uB65ZIo&(kJlf(un2@w;(+FIAI*>2xs((YZ6qb9Mdh%pJTV*Th0U_l9z2fS zk8A8xy`V+Xa$~TxKMVYcb^S zYA!~1<8oWRG8u$OEJ}>deSV3KG1t6wL|dYvGIf|2+k%-nD1GQZd7`~H02_xtnt zto6R{&wVdj=5FTjnCUAja*g@=dj0wJ>vO;U_+@dWL&qG;*D|v+i<4)@yX|Yi`aD!! z9oF26bj#*4x&LnQBh)NEk5YJY`@)PFJnI)dhohJ8b8gG~a4N+voDca-zU3jU#ymLc z`7?ppv>U4-AtS`yO*--s`v!EKYHs88h!YFX?}#JbrA4MhP|(6uA6aOEdwAjvdzvbG^@ z*r&<>ZJfjk$^4x0fQKD9t<{EA!58iJI8rR=Bdn69{Q@`ee2dPzZM@8qCA1~2B;BKp zUjZY?Nb!D9Lk(ygD0|x^8q23YGI|oS85BSYgsBw+qN`E4DYTuO7?Tk zCDewCb?OS8br$p>)*pgkKrpHTvV*YB#ay940w? zoM>qtsv?tzG2h|~pk`5==^H;Ix#Zvga7OOM%&TcUgG`8$!SHc0Fx1>u45q3=!q{g+ zb!uX!V-$(TR4W_TuuF$r<1+Q39Hv8c%xkEVR2>5nJC)8X=BmqV>TYN4`j+}U1I2Vk zJ*+hFLMP_Be4rKv5B$`_stYCT-%6V<5v{(dhbE(8PzzcQ7{coEoc>}{R#K@6rBL$$ z)#n~Uu4ll|SL6jJYjsc_ql)e-F2n!T*Uud(JFaedU}L0OpZ=3$gy-MF>vZ7+=}5|o zgs-*S&HRoMl$gBH92F#l=ThJ}C@Xiu>1KADxpO&gvwPWl-S7MU{@kDY{@D85?*PL< zJipkYwie0Q&H&~d*Z1}P#~=Ur^{0`c%9?A;Ip8$QCIkKab9!^n?yV_xU0GT7F>5ZF zyV1ej)v&mbVvy^Jc->l^O_smgTdA%_s)j16G*F4`;w+ByBC5(d)Mo5hXv0aSQt%&z*A!LTb&cNVKx?a)QmW2|ImWh_lW>_Nm`CISz6=`sXZD zseoMS^_piKo3~7EP%Gn{r)P*bEyV3!`!@HZCT!L26LNZiVAJEiwYLg^fmVMO-<=Uh zZT9-3wsMT?(w;`p`?^lKMs%b7caldPSyEoInJ1MTXQzgdNCkU2g5n2l*Az`bdXgH~ z#&Eanew{~8t;S&0T&9m=#VRv8v@Tnb{WJ3(K2653Powi=YniXLK5Lmu~RJDy{U^z$CUV~oI!rLA1IwWp^3+Z$-~&naj)6IKb^CjtqKb79;Cs601xhJ z(+v6LG)Bvm{GZ$1R!~hA|Je;asj6m+fKx$`w%n7uGK=D1bKYj3+m`da?EC(F?zL>) z>o&VH{}}m1xY6DGy`b{>tYxIgm}5*GL-m?dT+BnY+2_NFmQSJ9XN&aN9&Pjd83*>g z%dr8^6kf3`55DK57TUuxYniGB8|jJ89aL}llj+1JP96^_u^~&we*Es-?LW6M4pOVH zu)~Dbz&6KM34t@_?f;0tH;JquPa2~>kk$UQsJpRBe($9_09`d-4RT`FjWpuvim4)^ z(k-Fmv~BNEXL92z$U(7WA(40M>W1fMQn)HnGLrTkx-`B0gWKM*dYr~I1kb}4&kt>O z`cKPkcIBTSvor1c*_slOS|xP531$YIu<9R8=x6 z@ZfHZHsg}bEY2(|jvYB62V)FX@v0-qK+LHk?iTIhH_gB@;HOOQJSM5OkL&Wynl#^1 zsHwuFon-`KH7Swsu5;LE>2R<02x?QH?Q({$-TPoKWKiQIRJ18l5y=K)2}HEsJ?}Jv z(9?7fw1Ozx^5{P0n#@){cP(faDWvwcJ1JRvUixPCwiP6G*PbDc)v;o+esut48yg%L zC712c6SE+t6oRWH^8PHm)?M>YDc!b zDOaVX0NWR=Z3%e_Re|}w7r^Dd0zuukc@FV*^ZWjoEi-=BeXn(Y)@}FVildqZTB6sO zDmum(bIcLKtNFUVE_;o6z0Bx~(}iC$qa&LGCY2Br2;iz<%$SO#P)#n%y`Ov3RXTP| z_|d8CdWOh+e_O2t^DGJOUc^kpKf}iszOsWmqARM3;Q^m7+ec3JuF)7#R6xFe+VN6u zU8(5uC*#z@r;27-eaPAQnoM@~mCDono$vKHqC1p_r1+y)Po5SA1rbFGwC<1E{BS&< z8u}GFD_h+~;a>MzAG2j^-D};pvi=_cI8;vdnR>w4LBuQg=2GsGpj8wDQ5FI>@4ODEEXVlOty z9NijTBp&kL*1sIuVRGwJxcPvH7|L@<90se$*Uzh)GJwo;fV1M2(eJsnq@CA6lUoHW zgg>wH@JvtqcaS;U#}g3ECO`7?ZT9!+o>6{|4M=i(wX>^RNLqL6U3P=2dP*5Ql~}bM zKvfAgD9*_IQ0H$vQ$4qMbRsS&OQh~Qmm;h4AUiYoNTAeXEm;rdj)&%1-5fA%c*PCYLQ9veWaSN?dG=D>$tkRSGO-oLZdz~~$BwvIzxhGwZ%gv5SSs^hTGuT>>5rDPMzNgW zM%sm$b$?tT$imq1hFY9<@73y^)((UX+8$qz_%Q22wk-)HB!E@36_mUgea}Z@n&bWA zdRdFlzF7i-;SaG7kn_ubKA5iW1dg2G;fv$Tfhch(N_E>{=?4@O7(G{Y;%@~Av43EIBt>i{dvd6ZQQ&aLmy_gZ)GSf91ly%x>I`lQ1LRp%Q)5&2@d5ec?q7p6DftNyc1EEBj*rp%911goI9r;NM2ryNt4SptS4?#Xz&Z z%iOK(y@HN@j&_;#3A<7^vZOd4SSd~pA9-YX>R`zaBYGN1XOtH713q@cCJqv}v8nIo z4bK1J@y;dPJ?fQCBX|TFdk;uAzsUPI&Uxqbo9vFd_%b-|o?#Uk2H#_psu?ZX{@!Ny zTKBSbuXW#_wQjTfUMu!k#e-tO<%&ifVYF?yY36I0-^Sb4T6Qn{-0Ne0o3CZJ8{0?rnn}(RO*RZzafe-psQlhJRd2hUf z^=K&lx9>BW*u>2vFOyI7*siFA0FdL8ccJPL?{;C=ftf0BN$Nz1>i)G$rK)_Ppi)CU z6?g%Z9c&)1I;}pFpF15z`UTHyg&d%#UMXi)Hv2!@xnhrlEbED9;*8ZPq4_+|X6Uk8 zS8P#jkh;hIuf@yw#KW8wLsaIV_+}tv$lE6GCs6FwsfhuA%2vxJjr!Cc^~Wcb$PZ5Q@03uo5B|IvV+vCDvjZ zNT;XQ335x8yQ+Yr>}-r7hGlF;F>iFB|K8n!*mR6zTseNcVQ_}mnTgp|oq)*^3DHdoi z$B8ocNjwhb;Y1va%wXO0(E&!gRgi4l)?ve*n0}JJtavFBedX_4;<|yXb`G~}3M+`% zPdLZ6HZdkB7@d(~^qydjH>k92t!W=auZd6=PRcV)^J6@8)Bs$sP;DC1aW0daI6QQw6Hx zZf=+p3#5*L2@n_q!ec^A=fY|`^!AN~qq0d0;oj4(rT;#fYbK`7iBht?)X8*iPP0y| z_qqY&kg>NZD=ePOYY!AT=+lPwB=$p#QFABa!4C+C9nkhZsE^zk%J$W$0+vPtNfCGZ zA~a{d*Yxzf=&c#jG`3C8t`zC;W0y0U`@`LwAkEgIm&9tV&;7pF`mFo2?)N7M(Ph5k z31(CFw94TOwuP?OZ1P~|KlaK-M)=2I zM3h(W1b^|;=@F_6L;gw+B{Q~>-xN_?gB}v#{nXfpia`Lyht_d@EIapHpaOTBj4P9o z+M&adlq=nN7Iv5p5utBpDk^r)lyP6k&mf)&kE9FgH&|QI}y*A6`Y9?%3Rh^{Fc>?;89OvTXoJ>RrX$fSE)Yye)HE zw6#9V)^c-S4s)0&A(F$N5nba4L`zo(RQD;jB_zirUF6c71fBqS+0HPEDA%p7K7t|k zq2$282ue^y(+PFtAVSa4SHK3+4RU+Qk0?(H&z=_d5ULlk$v-|zA z&yP1rkZeMQ9ocV|M!M78jdWYK?2hWZb$>qV^I7-jzCWM$`_5hp(X&@X1mn^ujEEHo zZJA2h5rIOcV}-EQjLUGF-^&bPTDKw4ZAyb-i3Ay;G)i=?Bi*=ySG(6|$XM$(GnBwX zAgb#05MrI4Xd9r1Z*E%H;?p?)=Aj*I>{)h1oV+KXttzLV1_1n zHuESRm6&b5xS2K{7T`GS`74*ht`$D+8_Zjf;`!=l8RM5{mJ&7Rvxq?_88sDL>&#~D z+SBvb1KIqfDpbS8dmH04`=vr7nlYmUq|46W0CE_x2rLUvj+i%o>)u(SA?j|bvICDt zp1m%h{yIpB(z~Jq^$Z%5w-o;1h_EZxSPe)Igp?2d9RDoGhV5N*o`^aV`&{Q09%OK_ zX7OA~aZo3x0_e6kVcvIF|GpY&0uI>k2prO_2YFU^TQ@^tABcDw{xA{Sn4I_40pzh) ze78$I(*WB(R3;Y()%_!a`!`>EXOfWaqfyqNA4XZ$+TA}5T?#xZSWb2$m!Sv3ZfdmH zpOXU&{z9>@nSf05JDHy-pQjt6Nb8f;UNi`XX7?!wVwRg=G)tC}CyvT8$QVPRDr4&F z(rb<>qNKPJ;>#8sA>lHUF|;OtJC!3zP8Ff5A3n7GNp%?!h$zFE>ffD12Y&tZE4bUd zQm)TAI*thAwKw6(b#?oO_7cYq%NS-$$KvrGC#OG7vz=yF82!yj^mY;aa03aL*e04; zXoHNZQL+7IUwhXJA6I|!ag@IJgroZq96LSp&4H^tdW42Vs^nFcuxfq2@6YG{yzkHF zew&#y!}pNyG3j!Nc>;v0gxL+ttLD6Y2a}>IG9gZjnFc_Y`D77|BD<_0xdC#JfXql= z0FlUys*d~qEL;1=3Tvu}V+%h^#(3@-DHHVAbA2R=&uIFBEn+w270BwUH|C!&>COZ_&-k)dhDZunE!A@&=f&8fD$B zbM|!}fknT0SUim(cil_#kRfA>D=v~60I z?oZy!+QqR=1)pI@Wo^>i556DBT&~k!a zgMMrFFs{bw+x~9mrs4P@NjMODe#as{PSQw=gzK+#Ks(2Sh9oWQZLgO$p^xz23{gJN zBk8ow(Sg#7TG|)9|Lo~XHyif@X&vc5oRM%vU>!yteOSmsmWr;>+z+v-zF6XpiOvt* zR_<75d0au=aoo*}n#7>PjkXvB!R`EzCSozm$Rj}#A*G1QsC;($xhf1IpfZQdAv&Nc z;~Lj%yvBG<8A`%~DdtdhUn1&0OxN%Uzc`{9zEM?WKs5(OXNHYnR`ll1%i)QheLFk7 z7pM401~)$MV}3mR4PF}8;DMF)ud0(t2epS}p^d_^Q%)kb!=v4cVnZJWV^=$m`&K%* zd~7c?SGmi}y3jDgT|L_P7ydpVCu$?c648AliJfMwNVRuuy}bHCsB=lyxV@Av2athGq0aEvj>ON1&ubdEVxR8yQj3~=X)5#{E0aH?jYymXGK zLncJOzu)d;SAnDt4X+~}PC?uOh3LT0G3PaB6cOg6XLtMDAM>s9DVG@LEJ|6sd<}q! zD08YPNH98hrWIerLol&y`!wXsY6$>CQjahA=wpJyd_hvl&XWJ>_c?ujq?MmB=D(EL?f~SUe44OB)eS|qmr0f>v$@54&}%Q zCcZ~k4>X(ANsGUwl1o3g&D2J6=l(%%gT!R@Zd>e7vJ#ZS&g&98hD~f;w-y(m+eEc% zuRR&T2LN|BSJf`*1|TDuWRP*!eO2)(B05w|WyBL~Vx{zZnqchk+)^7OIP8p#8`})0 zlR0BUazJ(6T`fYF1R~{k&A3Pd;ts6i8Ris+So11JicEAZbLEN9(eIgq%Sc1^rb-%k z$GXP}C^#RNKO$n5$WUyfEa89auQU-uc^OHBmlsggGmjJ53ggst!xiRjySB{caU-nl zcTimC)%WWwx=458$4CD#Y-!BuhaG<&9V?EEJ-a}*Skcx#GK1T|(*+hvZgeW|ByT5@eR(xP3N5LXa=!v4sOsX8N4j1*KsnmkRe)Mg^5KaV39R>n8wv zKy1ksY_^(}W#@73npfD4sw{9H@{VU@o6Ts@RP$BJ5O;2A7pf=anW5fJzDiRKA^nby zp=K-K_*(ZJ0`|}6zSsS}zu))w=lyxbR#_M{0UDs9Z z+F}b@&w|+CL<%mIggB3AoH3Oes3_Z>Av@9g&JlYx{;e&--d!Eeb~f_1369s)Q{K4hN3&-y6PEZCwM5x>%N9=^@^o5X} zMa{#-S$L=A*p0V0k$b%wc0EaM1w8Pz(e>%ua)Wq9B{onK)!+j( zX#$UZX#nA7LIzeQ;^KBF0wTP08YKG=wmV(T*$UQ!W!K}PcwYD0qC+rQ&gl^-OQ5z3 zCgX1NlSRNewoyY+BU*y}FWW5X!#FKLAg_jK?z6JZt}1N4Bd(_!ORzhSN&p%bcZ9R3 zh^dJV8C|5G<2?E~99{L}Jp0kl=lOV^kLU61=TpWhrbyVRG10c)Znv-2wnp5%NG&n| z8=?So(R1jd_dWz71qnCY8Y5#sC{?(%-ng}Gd!FafPtm|cfhWQ`rpCy~TiY5FA#SbR zx9z^Q#>7nS=_VpDF&jj+6U)Z5g+XvE#VI#y(aHhjgw~pFwr21FK!CFPi3sZ%oArV* zrij5>-;`$I8>s~>keBvAvYKfX&Wzev`$>BhG*3qu7^r3&RH!&vwA?6GRj?O|N=?a| ztgZ!a7f)y~`Za`<-8I?8pV<}6P04$$D>e^AhPbXrWEHh(L>0HP+ zp22z8mjU3l*ivDs2&E6XQi++xKur8oB8ajiV-ZpBKhukvb5RmMmbIwyNq;T2Uh$8` zOTC3xVB*IpG_w$0b7J#uW?+ha3?(B1#o&<a0Qr2*yZ_Sw%HsG-7KZ zfV0{dI60uRYdKHA@&sVd23}aRNol-`yCN`%d1C+oQA6(dk9i3zjA`&Fv1n^Mq0ch&@JiLEgKmo&SMM0GCX8VCf zFHK}ojJZy+a~TutS|J;!AOO*j5E+Sp*m(sn%Ic6-Rl#`#0Bfj1f(R&9`Fd#4JixJ) ziFxb~h?;t43IIos>Bh|nyr>hJckopZqGsWMgJt8zp}-~k zWwaE~0`?hb)8#`wfak&LjQ?r|?+Kf&!Ga$+qWFEMYF_oH_ zCK`06Fe|F6#JW}e81vT4UTiiUl&>u*;+N_ll`65gs#4MjuvAK3&=sW3mg1?dsuo#R zI_&b;D>M(t>N+A#yb?gEq@%dbL@-Hp)FW_;tVIN`Shl>C3xX+Nv^b|yluZxed}t}K zWMUC6`V7r%?aCE*q^M*z^G(*DbSti{wd-y#c6OvRXPtJBA@q0938nJ2Uznq7RG%;S zMWxIbwJFQP0!V+)TrbNbyxihaKf?eBix~BtX-ibLE)%{^ifgcpibe&{Awo)s7?na% z6iAeq70f)z*edDAfw&?X5t5=NxJ3Xa&!+N-60M##elDZtutb}O8W>(z?P@IgG#UUf z^VYZ#s(Ah&hyQZfw;4*2HBO6t31~GFq>7YTX{d!SOEM;X%hRmM!*x9gRp~8`S-Orb z@knW+Qtfr_HBUJ~Qqxx)u;e>0NGSHl1c^(I+!fX3tCo*E%GV|CS%{`3mfSL3H~r4I zylspeJ{-D=vZ#Ni{4LfECRkh2OdOlyGQSs?XsL)R(gxC%l)NpPnSxiEBQsp0Auuh!kn@FCZxzwci^ZeRQD-rC00m^W`(V8{kIRL>#LKE9vF<2*%`5rJ@T z+mGAV*S77>gCZHAsB$}zX={Bu`P|w$ZpY}|JLH%m;?_2I3+}Dm+IHJECL#o4+PF2Z zU`VX!p`aJe+`IZ%^&mD4f#qZ^lt0%PNyS+P6_rUJ6@l%^BXNo#ox1?;P6R(k;k;MV zs$({lUqX$7z_nG&G}MaoEtR@@ngB7n4r1-gMFC;yUg!VTIEaE?i+R1c%F5i%nR1f5 z(1*nl^AD6VKupu~HCR--(n<`r{niB9~^);!IFqKwK#C z+8G{;J88+`w`dN$6m?L(jWXb0N5DJVAh3LT~qOWjn&WOMC!nlzWr*6Aio)8EV zPt`<*c!&5ZkUycpWtp(%BM3RKA&D)Fd;)+G-AMB=hN`R`4WV}fctxF&Lh@LBsH*1e zBHSxIpx~by%&BE+bngJI@(2A#(-5D|%!Qo=yq5zK zRg^EMV5&`zMq27rWz1XJn7%Y?KazN$LglVPF=|QqF9zWfZcvb+Am_!svxtWPpeuBp zn?1%uQ5lO&72LHNa6BIwXilRpYm$8FMz&JbnDQ=GWI}yx!@Q28dfcdj*OPAu>Zx63 z2AuAXJhK6)#6LDuAXOv+qbR5CN|c*flumLAC0$Qmy2IQ{Xlg(PMx?Cn1N3GrVLhj2 zG6~DYv=31o(KFc0F>>QgRD`)TV}oXl3Fe{s&ciu8a<08UNlwwk5`slr%$MZan<9YV)U&pV<^LZSOu6{kw=NKIk8f~|2 zzu$h`_P@UF_uGEkcyHW*8xecfgcxMgoAK-M{Plbc835GwZQr(i+wb?=kNvhYH)bL< zz#-ZiGxM#T`_|5W9z(xG&oNZpBsC&#ZQI(mG2dF-cdsz*=swcHnIgIm5LI-HzJi#f zX_Eg75;1XV8Z1tDWH}z!1@3fE!}JZM==C0IWT;TGA%$jUWTUGos09N9uqDr_HX9Uu zqIH)TZfUS7E|wBOrBIV=$NVT7kEUjI)6z?X@#5GrOXhWPjivlu=1{{awq#6Q)Lt0u z2w)Tq;AY@pio{hVTopZl+6-Ov-CUYJ*txPd)`sP;+}P`#eLYr~k{->3flxP5)%7NI z;k;p;Z7j`ux${&SGXgm4Xap{w?FbD3376)XxuA2VUNPmuUPE-*ODR?xe&M%xWg$n5}jN!eY#%>`V$U&u2gukL5@fF?D)YOt{A1PPIG9FG!R& zxgz-dB5pF6MM)h$EQOM3F`XkxJa+4)P(vMvLSF0GT>TZtlbI-3l~T&o!4iSf{zWugIUQ7t+-06K zA&ImmWooI3AgNJvIpT9*Df~2|s|{>^0mB$WLoa(vM$S>vJa!B?YlONGB&nP#@& z+0XMhp5Mp!^Z9r@zJEUd=lk)`_w)Pt{CSQi05op5{dT{7-EMz>?O#7`KW?`l+qN@r z9;ohEUd2T1ILG5WzmMmy$K&VmG_d=2yY2gJ-}koN+IDa4*7o~;+gc+c1si;N)634% zxNU6{9YaSSDo*wyArcWZ;;r$<+ilx9dYk#7Qm;2EeRwzWK({~?9k>yoE#)|JsS;!Z zK$gb$?mh-&pvG)~&_{Z#))G5_9tet=Z0u~mH;{6lqXHPn6jtU%Pax^uL{4i0DzA{%^vmJfWZq9VuuU2uZM5c5(z$B+v|um}0&5 zYN5D%Y|ycp8-yhJHa1l&lV`M~i?jVU82YmeF@ zX52`fImT+UphueTHCv^=@LKZ%vI@WYjx}>}Iw!xHIc5|vO{JL8?Njr^<)!M%45x|a zmXV_{(lRMoJ&8c7Qj*2(PS;yHBLOX8mO|8ou!$zp7%poEm$5{|S^BXSH2_Pq9h;}D zkQF4+JNM@jX`&Yx5YT*v(`J}_Iv>L{ulSL|Se_&9wuqZCkRczG>?i{~$bO2J< z0>EZ!>Pz66i6z~UiBXfmK}0mdtoTmcn6Z-5N<^AMhMuISyRd4MhyYU^(#0Fe^&#iz zLsYsKomT~bh902`8?g|QlBx_rCd47pG~4;NJRLesf!sz3bAxO1nT|*oD)TW#UKoD4 zHJ0^^B_KpJ%pS?hk890&a-obENP5;%gJ?wbC(blg)v@}yDXUl*5h7`HFd`x{RWokH zt2iqezI+0Z5!lJSO)RelYAWWXM910B<9r^+^YQ%t_4xVo`+t5u{^xmokA5QBw%u;q z?SA{~>+7%k{@0KF>wf>*+SXbl+8{-?iiz3T$KyPIJ)b`x-@lIM(BWki?%VCY?f3n5 z-?n|*Tib{mwas6N5E+H3H6B}Qn{2~toI2N^tHMOg+=v=)jT^Vtyh;dwsSMFhV+?70 zwAMmTMnqDaEWHX!A}4NxXb_#oS)2hzM(nCXsyK}iv2P2R(;pN!A_B+3Oph^O7L4W6 zLb*`R>RiLC+)h|zzLy!W(w|Nx#QWr~bDfm?E-HE%E`i@zqNv>BODIRlzKkX@$hw!A zbpsyO>-Aj9K{%PF)jHvliP=R5L&0&H6BxDrv$v7!04D{L7b&{X%C^4v2|}$osDoIA zq5~>(rLsT*aV3_uEXbFN)?>e15NErzTuPwirY&6~@!pm+I8^-k#jO}{D@cVjrs|+t z%==WzmgZAEeWumS+ANrRXVvDbfuF-E;I@>XDQPqJ9llr|Q@Vu&Nn*5IGP!FEAbjCS ztDEL3iq}o(55$_P2-uis&!)QoA*fcEdom+HYTr8ZnT1+|S*~l=Z39Y)XTjQsV3IuQcQPTdE;}*;s8u76h*->mo)2k1v|B_Qqjv;+9yJw zvfi{Mdj14*mfZ@lMm1b^!TjVh2{yOH+(SwFr{}Z)XFc)77k}aVFP|^I?71Q~O&h3e zncCgUF{rS)38zCaWbM7>c@vC<)Jj6lm$HrCJq8^Bx(!tUai$8@NMxvh3Cchf6dmC& zR6rsGBETrr5pzP#KtIwZkXsdp5Nj($eoe;$z;RDc^06RAXz z$+FU1-j?Blxz7+HqTb@L8+zwt6>oww#^}8t{XEa}_S%BQUwk;AeF_V%EW*&`Mn(C%1Lrf(5eIX#?M%#!)z7znaDCCn)TPrQIj*p0(~EnFfB=P75m=(dNvZN$t#2&#}vYO0}nJif%KPgSI- zZU>MpiZbdvk+{yCW(m_QiIntaq{NEgkP00RpJq7=lAWTgRhZUWQ4}XAx#{m-TvkCy08=mHQc^apeV@?kI~ktA1@$FhWWt$1 z7d0BfQkp8V4qbdeTnZs0FOvYHi$qn+_(VwbiXp4q)TO|QoL}x5& z`DM~Njpiy7Ov9Yq%=B7f6_%{Dsf)n~8EOMrx$Yv^Sf|!Z`?$bvaJRlv1e3p6c)_Vf zHKt^~jngn%6lxKNP>g51l;xUE=C&f|7CCDbF@25I(_E%_w8tVS7#c?KN)+{^%zUF| zHsTqp!+#L1Z9MwIRwpkVwQ&B9RI? zt?nW=dW|Yvr85#nnNmXV9>Rob##HecS9*8>@Bk12UID@&H`bi`JXB%#XOKsp>QwM< zqM1szqLCq@BHs5{#!wOUMB&QHC9gGRh{(*?fEmri7`^8ZfFYAj5x3g0c|;f4Xr8R# zf05|93@T$B=Qxl4_;vjJe*XK{Oo-GFnH;->>x7uGG4$=WwcY7HcfI+FVFWC$l?F4-I9zneBdYoG=ZTk*LqH06N=mshx20%cKH*So`qIUL9fZok#hyY>Rni@vxlqu1S zC`Uk10Rs_r=w?v;$}*CtH0H}jg@~99HRZL#XyGtY**nrF01$B*0qLPcL@WP~GeYh% zqmW6ITyQokb>7LHS(ef()%*ftLYxx0hcJ7;7`yT^OPOmFuYM~Nuq zJcBWM&8TFfWyVT_dTFXs$>I8){pSDxE@8&0Zo!NJkPvW!@+8Ip)D)6uEaa7XDuPfw z(qP7h;p|%+1^lXj*(7NuY|QhXI3f$ySXL1wc+%dsavia|%ZUA7Q@;5tHesd%0X#ptofIhs@tDVP+2X5EV1 z%m{N~FDfb*6E0O^Y*9~@Bv}1V)2_++iheCI>@`fy1!hi*pK(u6b2DLiFUsFX2D}`4jLB^@Wn&?8D z25pRP%;=%Hrlt|D4u)W4Vy5mnM6GTI-e(|1Q5N4I1S0}w+!`|x0IG?MLzoyr`~nX# zj_7=M00Sa6rWSky6@hB1U^Y~Ss%Un|Nva8naC-Ww5pn(p3_*b?QUWo8^kt1_%0&5) zUYL%7MupNeG;s-pgOcBu&69t*lA6;inju#aZ>5Hjm- zL}iT0V*vm<$A%j>X7P|)GDTx#Q!umUXGI0QV`J?^tN;)wQdtwNP6Haizzbuj4AC*p zqd$-1@jQMW{aa)(^S15#{`GbH>+Aln`~Ks;|M@7S z&d2e5oX@i#gmByUAGiCD{r+{keeIivx9{7wdkrk4RHcal00;eL!w1`+@6`$Z1jGfXFm^B4R((xwI&d; zM}1{Q-wJ&N(Fz)Z5S@}S2LM@ye2qT|BWfYZ49PMs#33g^mZhzUOxnoy){qIxg7o}f zonGl_zf8mw@q?CLvox@$jSmrOl~UDGWq=_XWp;R)t)7~`Ci51ysjzIwAejh(2%<3H zWmX2HLW-yrR}DMF0uAnpLOQPL9zJ$$t>?x zWhrLJSOmm@P5qUw$XLcy8f8lurgL=R&w|SJ7_zc>p**+g&P_No-D+4R7_Ra>K=2%? zBCJy$Mc~lMV83blOzM3Biv)Wgk{WjfmKL6{;GD*-%BI&Amequ~vCzE8K}7vpT%94Z3g4`6?3`qC=y6DIgLs zHFj*oO#8O&ZQI&LL>o0G?}zA>eGE*%z;Ovkfyp?Jh_=?pV`fnH;`PLSh$(80M5ssV zd4Nh-xE#M3tp!EWmQipu0*X%!ub-NPCrM1yWN5hO#AFQVLx+eA5ih9`KgdHHGc%d8 zH2_m!24GhJi0sgDn%E^} zzy0;&{&nB>z3to@5l0UtMNvD(cpS&$czz#`=Xs1V7^&^;zTdv~{cFG7Z};22f8D&~ zx))^N#b@pzxlu{4Xhmj16yOG4oNbwH7s;>LTUId3ia>T0+t-h;|NgK4M&{@9?7bsG+cw{3MEKWVKLF@F zj&b%rPO5lZGisX}JfBabho~SaBDKc8|1BBP#_X7H^sXwz3nfK+p{Cr1ppS!P(nQRfl*HU_gw%N*FFeGN8sAF^@QezRN4P0vQPqJ#!ub zxv|ewg5d1kfZp#p>y$-d5j8MS*W5G%s}ViEH25C#vJ*3Cm)!N~bV8w|#FcA(sMOr- zEEqGDv|p3)qUWR6rAcUNP|eHCvv)8JJ55{?00JD}r3Y_Hcun_>O|_S$+Po$fR@7JC zDa>qyBpaO;GU6b)B3JtoS?9XbGKeHqtCrSIsuKe>M%61!n6kJ9Q^{Jf!Z3SOufCRv zqo9Ni1YU^x9VsQ#HIzYZo{-`31F4H5hBbJ-qVduuLYT>G6SfyFz=T|N^Hn8-E#p}Q z$~Bg3$^vxXNLW4=jB)hm3FpBgmMZ3~H2FF@|6_J>0dqTGMrj2Gnhl=UUxKX!0H9g= zcC}0<*1J$XX#y>fAH5&ZlBGU9>}d%v4xIHzuYbtzRsE1zTNQC>+`7y_Mkr3awqPK8;^*ne$|p=wOgBi!?wgY`3i zZH>+9@)S@(m?((l*r{TufJkIS29apuP8;zqpsG0Qu9;N~KOz}TOAKr%FS0iYHxHWeL`0Zz#hdow&DB_{GS zt*AP2X9(rAKQa*~sQ1-ew3Tj5k?LK6G_aQE`wtNj8xFB#oPG4} za7$G{jS;=&j50TE+LVK7RIG?c#7NxDPL>(HJ7X>^Lr)?Au-J4jxta7&%56j>q_%H6 zQrot#`|az#{q=SGy5Il0?LWS5`@ZdsnYjV7H*XfzqmSo#KKt=FpU-}rqZ@#G10$;a zwtwyWZQJ*@@7v7-)1y#r9pp+~PiYa#(wmMuJyi14DtTmSZK0;B;I#@xqq>bjF;oCZ z*n%sKQ&iQP<8%}~9{OM!gb}StNUGY;-l2~%)HHiq$I3JFzU}+I^R{`PMnKs2&1uYS z+rGZO%z%j=;qU}AXiSL2+vWvCDvi;g}g@l*_o8DZ5oFZER?wvrRl5RFDskUe4-#bzd&HZLL}19Hd< zRWvgb0GRQbMPg-c&4e%cMv#e7IIU)zUaYiR>x+f{8K&YWxD%=PMcd#!C{x2u%~w9A z6cSF(fC6N+82QB^=jIC7>YU0GlldSRrCT)5b*k!6O?mdB1wzF*14s6OIjxg0C{6cN zgwBXK^+oGUEnWqj5GM$RsB1sPOuUO$I2Y9Zu_aF85QQ{yvPy+O6m1{`0QEWr7>))71RyaqwP7|41Z)5Zn5u~Z8w$-Tgj$xEfuWHi z4e5kxwjmN2idy%cETfOn#~32gM<3GFgb!so(9lUM z71bdsGDKty6IGRvR)j>zv?(hxiVAZhlMOZi^LmtqX2#Pli_=w=IYZ5wx4w?x+RT!* z3e#}AbMXgwh(5oa29a~xAlvb#}Z-fsJkulry|=62iexBb3t_xt^?`+mRgU-xZq z%*4dl3{XKt_0h-oaeg1i_jx>y=Q)OgZ5!YA?aQ5m`|ay?|JwJjZNF{%*4o}SBF@-~ zq84htFXtzt19TRUEvu&}?o1jGQ3E(f_oC2P?g(7Yk52-T=?oIG>boA^1h+(8;ivl$ zgZ4u}9UZ{N7+~Oy%WK#^l;b=|>>)>`0MM78aG5j`q{@KjxORdq6{OSnmNN58hLPCQ5z9aDYJk;w<0-~v*DF89ckba&Az!_1MtC%iaP`Ys1=@k^R*!w=h za(=mmkr<|W8XuSLJWVnEEG2&fYHKUqc{YE~IItvx)1~%1IaW=uQdiu+ZEdwwhHH9pbn~f<-EhWr~ z`;|-Rnxy7)e93#YbyW(jRBc!U(+FvrYOgZpFl&<(2%fwcWa*QnFfxFrpqTF`G>;oW zGsTEVb9`yQlto!`_a@?mwPAbWidh(JhCNxTwv0t8n2nkK=n7C%R#nhZ5>b|>Y;M~m z0I`Ngl@C}vN=|-q>N&yX*Tn(`iBl^$8&lDT8)LmGIOV%M>$<*kA@boiEda7WO}~+t z#)+vWrBnt_mc|I5_;PG>L*}TbEdTA#H6H6fx(4S>=l;ZWL%%a{R_4r#qbgiv&PhaQ zszFof7`9EsHhGWopfl7xdI}(j0;ph;m5hK85kX1a`Klla!$1s&Y8P#y!)OQ82n$Z$ zU6UDAGf+WbGdG`i%+}^Zw2Pc)ckZT-fD|GF&>Ay=2fhMDj5jx8PtK1dKtM21@fw*b zs_tTQ3P`%B3i!@qA|httM$BxjIXd#v(%MV~Jf_0AE}!69aEqu-N6wqd%3cW96&*9Z|J zHZ&tO05nD<4`n0Ng5Pyo14$WXvMS~|_s}%t#<$yjs2JEyc0{^u_pNRFe!t(oZu{-N z-#2cA80B77MfDux=;w1B&wf0P=P3hBZyvg}?_VBzb-&-Y?Y3>Vecv~4Y10DBS{+pU zc+Ol@IWB!kFDU63&P^4Op$aN?_I^lroT5>zWMR|`L`B$8#0y#uCbmoi6gbF|*qny>}IbOkWof zWffKF-ONO!5fNepRz`Cx$oSuAaqqbR+=z%&m1y&ey}AW4Kc7!PlF>~C5wR!P6LoiC zYwaBFww{K3EsdG=-bKU=18aK8djkO5x9xtv|NYnB+qSjiJbNd?);6E^#&r9-gW+@A zdhh0}vq@`B!P>T;=lS^cOM36Aaw-B@5!vD^_c+*h zbsj1r?=*dQHMQQc1TrcdpuA2iM0OmEY0VeRg2)hb&`Aq{l=ZDb{H8*WXmulAGvL50 zet6on=1V7IvL@D10E&vVz^u)clbqb1O-zQMsxsroqI#0IaLby$NgIJH*4&le-A&U2 zY~?AwB7+#IqBmD{<8Ud~eHDg9zLvq@Thud}y*-_+lI>mOE?^f6&n?tW#?!og^NMK} zrfkYafN)4pUt!A9&-lrK=@q?S$guk7YVQ?{y1rG(HGoAlls&Nuigjk@bf$OJO{}KU zy}FQ+y1eoI;S$+%_(Z!w2OJ3M?s?Cq4sSea#4({7bcLbD1|4wsQos?$gPt1`wbV7- zWTvL1hK2(Nq5=>aiCQ0W_A|(<(T7CmK{R8Zc=C)tPb(w;FiwCQogPhZHj2CIeT;GT zK6>|mq5%;iF*0wBSh%(3#Z_Bl1O(^=jNn5zP!n1U9Jnm=3e=bdtYQ+QI(|S~CkU%R z1}vx{q5{0IttzNURCvt*ckywby+5D*IF9GDpWVhF#BJYf-%U0XF;#zpn%?jxf=I+n zrW)x-h%hBu?uepJF`46(wJ|tEA_rL9THCh$%an*jzX-8$+xFXSzwPaIbDxt(O)0r! z_RQ*8=XspxvyY*wt+jpI?_0!O{kY%1_S@b4gWKL(+qiiI+>-HR6{|9jMufmcd5Q4d zJBMH2Q*)1?s*KUSBfuDPoX2sVeRL0uKp+4@WY32PQ#TqySJ1Jp(kaBKPG`J(q$f#` zc6Jo|SjH_f{`vXO_xCpQyCcd-NLW$2>C+6$-kqV~B{L`*NUMRnP`%2V zt2#npCT?t)5!xw9Q&cW1mGvp66vYyql^Zpk4zG@bRWV$$wh;jK+kU&<0B{HaqC6!o zSnf%@?LYqOzy5#!|F(Y(GkQKmbcg^R``+&Nom)d(E zMlTmzP8FzRK>^|7IV(3-(m+w}E9t-Jks3aV3R=%}oVsl#0VYbra&2LdaI-F55*9PY z*Sm5}<+QwSk(5bw)Z8wJBJMlU$&7-^)wqI*d}o**5)20ptjGVtW0h+yP5953En}|n ze1ut4CD8IzmKprwaGdXu>0LR7D@!&BhYDwV6%qB~5Ps6)G+~kR)=bn`1P3Uwd08r- zcpW;rjxkQv4j@iM5dje+vTrU`pkOAj{zbuWHP2EYv^If3Q5ZspOG?&%A@;M zv&@|W+1K67i53wZL;H|EyaQlA&*S+#z8~k~A;-bYdb{a;2l-+HbUu&J5RKWGffQAc z*+Vlutjdp5wL!FH|4lHHr<{-ofRGzCY1^)uXy!5IDfVRVog z5Rs~kG3v}CRtzZuf|p5E)joQ}=n<7v@{PLhx2^4fHdMf@k8$?yj*OAI+`PuWoxPv2 z94aYBfdE%aF>VbYpfoFnK=1uHj>Zj;&N2EJ(J&IwE5n+Kn2j-Xh^Z1HbMRX#a`dzJ zp;Eq#*+@Hm4Vc?zW<{(^u$cIzLUYDK#;#f=0oo$IJrK=3J$;P1#Ia)tz>v4L-Ea4= z+x_dQ)@2a0Ck$^}Yux_pzy8m5+s}SDERIvC=8jq!^5e%3KzJTUYpt~g0B9hp|3*Tf zAA+NB7F>lY;&N-+zib<3PFo9 zdE{J_nsISiSuE8oC&ApT?X{v@h&14=9PbsXCXQ1JGP@$05CE`hP)$*njQ%C&U<&4? z;6qf8C4!6=&*-*P@6O{OB|}`OGVp}fBQjtrnJ1 z6AjOS7s5$#cy0ccB72q`OMtWXuqx_mIl&b?J#loVgW9s9i%?h)Tk)GSvpg%z>B@*B zG%*1=2^6UrDkw0KA*!ip7d;gQpaKe@c@8*U<&Y(5dP&M(nmjz<2;Wc15n-ay0y)K6%YVHw41jMF9LQ3p4BRJJ1X2vj7 z?U!7{B6@Sjl>AO32g?71$;^izc5WT>1OaESyu{~u_TxOC&*S_1`1R}j^*tU>BDAkB z8(*yE(fL5c#KxS?BJ!B-S!z0tF;~pN#O4dNI%O^*5pQg!sx1Pv26t^v^MD7lZ`*#` z?p~MGAfm`c^%(u^BdtgmTU^_$+q zU%!6!vpe58WN>R6`Tn%l_&iTQk|8Qy5=_u(XC_4MGI~Gy=(Uj-VH$B?c^D_ll43Wh z51Sz%vxZS#HTB7ytMu!b5z%>`+}ghHZogesP^<_s5s3B!wq~RE4+T9~VOsWH6 z|MB%BEDE#C+yqcNq5HHsx?*mKz{HQ|^Egi%<2VwLEF0i|jY?UEy3ht!hlnG`(AnmJ zrN z;4J8Pdco6W=2z;48C$gH1-mW9T@flc$TM9W3zj!5JX{&34CSQJBU_qE8n_@ds0?@WwZy|bOH*y654mCi z@2}YY;@W_p|qL_Vf81&!Zp5IL^^K5p4T@yWLF$ z)uIQA7hXcIg-#Z==asVgR_PdpBs@V^cUG*1)#glW43oafO%S`%sbh!1kO56cLdb z6SoZ__Jf(DUOxa6x3+o7D~hN|1yfZUL(X%YXFtzzj?q;VY-{WlIQQ1>`|iaxwzfCk z8f{F32s#BE%jSOJ7(!gA4)14$W8bHs?7|DaE##`Shr`0PL7Q*Kg(B)88C-|Npr_a zts6YBoqv;(=1G5otxR5-O?kv{c0R7ngXm5ww3?g=wEP+bw9G`FA}Nv7x~D4~Etx0( z%2Ht1T})1J&KSY^IxdgMX%E4a{@MyD2q($h7}<;^L`wEXEii}R#bmo;@l#*STTMJ z-vFM_rT`ME%rfk~uxCHyIQsYZ`2Lp1w{tey+GxaE(`~oD+a{ojD$$5L{byzhz!ryE z6U{lix~LgTiY2xdk`WL)k|01PVry)EqaBks@gC)r5|G)qn~n~a`e&BjENd= zTiaW^@wO8awUD~V3`|DkCCdE5}kn`+^_Hmr& z^Ee*;{C+;ZzaQVvs1^Z806h#)KhH5y;mIhv+hvEF*6y(a0M$q@OjlG8)Zya^cS!c# zfY+WIhE@D1-f*cJ5Z!Vj8GUl-VPQ*(S@R-Ng?o}i%^W)OZXubklt!sPbV1k#5S0Z= zFfVe6JSYH?O+?hHQf-kQyhwew*%y_a8ftn#QrKx`tuA^aGFb=oRF;srV*miqA>&kL zA*toAt8Bc)j#QA=1u-r1aiIjN0GOo)xs*IIwP8cXIF2WI_0{#3DZS-9zJLDT(GT}} z_wy;o6LkRM^Ed&2wQcJn?f8yB{^%zLD(azTV+iwj9#0QHHB}~7)yMO39EZ+2pOdb8 zd9Q>ixjK~~`9gfYekTv--!h}PMqg0-Wbs86r ztcvm^v5~Y)s%fz0cL3CC6*RAKb&h~;IEGzZS0uT=1i4N9?O z=%2DHcL_$GdstcyASw6$y4+O`%?ykzNxEc}!nBGmkP&cGr({KM(E!1t?n>ZiyNTMU z>4aISySJm9r!@ikBsw8PR&0JnB^i^T$5XmK93nb~fC-q2ovNpdG0x+Z=kt6V$M?5<|J3I} z0Ql8O1c#s*5eg9#0}}|7HuSPdn*6v+s72tW-=;DTY#zm=w>+32&4jtYiG3x2Rt7vI zqZ$4xu-QKchM=mMkSdumD2POIwmCA>s0S~aCABPR7;|i3P!uxQRVBH{#N{dETg4$^ z#^^msC7_~D4-p_aY1n0)=@UH1IC?)uA2J{v9L{*PwlO#6jax%zATmI)D8J}V;fWN& zh}LwcK@@<_@x$V}0syZ*xeFVG=+ail1`Xv28~tfXh1h4uHzQ6a=%5mjXs z$d*bKK~;|Nl=1xKc_;>oCYI%ko{t9}Peg3oka!GH9Ym<=Wna`AO$5W5aNnoSP0ck% zq@KS1b9#m&KH*Z^dL^-P2`qgd*K1-SCssYq!@!ug=W&RL&r14VAohWwnRz=06&)&S z=8f5C4p>!%nO>F*A%nYZjcI0-=udktOL3|;BMv2RE z-&1lP#ot_ndvZ>(dvOjiHOCT-m~jF*{Lm@sD@?{_sTs2vP&tR1tCrzS=Bb*?e$HJq z_j^f#+_e|pcZmlNsh{awmW0!Ut0~67b&?msh3JG)k@m#^PC`_s@7)(O6Da{ba6Snl z%qL~1fn?Uqm`4` z2@hP-v@#3DX}$VKDgmWT112Ky9iD;Be7;<{O zr}%FjV|WI;BWDHZA_$;eN3>_t&Bjf4)m>Fv+Xy*|c8SL?jV>xfbqJgyrwsR3J&*DI z?2pHI{IbWh0iH6@q=5E?rI3`M(?lG^z3aX+oR7B3+`xwV@9*^haaejY4zJGoH z`se%m@!fmxszY>?nwDrxjA=)h5(Vq%rv*0i zBTK#pi%yZ0Q1$P?y$N;PJ$CnMnk|n{;b~cRBLA)g*HsR6kTjSffa(lV$**UW31HHF zhG>FekwqK4u8O{q#e+okG$_o-*ub-sR@{_g%0+^^6*z@s3 zJTkCBrp`*gQ|LI;<2*#fX?YVZ&yC;KlUp6dYFas0N)0l8ap6i=3nJ#b4Av|wpJ)d? zXek{*z7@;=h_N%Ly;S5|O?S}EnU*#GTD)kE$MRUm#3Q`SXM#CQ6S!XS%D`Rbei;m` zM>kg#QfLK-O>?ocXw%{+hx9MckkA5hrLbH~>GFthErJ0UyMThZ4`cF+6|4;xvHnKn&q@Ef)v`>54TQtFfuN zuI98Ryik-6rU9j)rzOxWQFLYE`W+~Oj4;v`nAuD*!A6vt1~Bqk{O0jhs6wJZ)*QYW zf-xGYSRc}d7k3(c^rQD7qH0~nP;oMm&{N425W0d4A@w+}-ul+J+s5a8-*4Nk@z$sz zU_`e^khll7pLz~Gdq2+cJjU}mjsyCE(#>0iotvIr4&hy37aQGlvj_z;Pz~O~AR2a9 zSrW-p0!%>{@qOyST)CDWOcZ3d831PU*|7OQ4JD%fL+B}j!xv9A?ltyM~0w8K)Mrxu8GI*d7GDs1@5&r|>D1@1pT|0cS`@;Z9d_z#X8Icsw z)I`-wYIKn<alKo*LSjX9ytb6=Z7;7v-8f2GkCTGo=MV z-6#))iOX9XMADPT@LJG;fyXNay_{t^xyy3DzS<{jw0vT7lPsUVL}JY)zJ56Qp&;f> z0va!b8D5{d+(A{l_1J7HSj>?+8@CJqh!&?XCdQ)Z4mAIiO80Whr7OU^26L9GT7Lk7 z;vCD99`Acm@XLZs>A38x@aQE;0X9!*iPI9pF-b5t(>jGViPGtPvhuzyD>Nz99FZ+f zaVtjAE^$l?t^0B~47?phIa6N-wjcwmY4tLM3)?d{VepPR<39t3t{5feH&Q!G&MX4w z;sIZFct*G7U>3p&-_Oit$6aReg|E#x!o*}|W>lBIpD%9>=beq!w0R3~Gy_y}y=q{9 z5^o&x5{*C!uq8vTM5w0ZAfX`w8KS`;GGa3_k7)-JMG+kcO&}U*iHHv91CBnsc2Nz z8Y-KT33`*H5V4xO4sD)82phRt%LEG-evo;YnIW=*iV6UksdxHPXswvH)H%KdQ_%djd2vpM9eLt$CZ+#st%BM#kUrwlTCE*m+;HS=Hvt_L1;n1?3*k+h?7*6%oK3&t+lEjFS4OJi3}q3z}i! zXFe^WUfvj9o;jytnQlmxtqVIe?f$rlrITXP(kmjaqg}yR@WPWVMvHHEP0&_WRr==Y zP?YsjqH^^WyuD(TrM>>lpuIO^Alg8GIrUwz0pSCZ6!=WkpLM{ zh=`?;bpk?Sf{hI}Ktw~n-EiCR*02!}DuQ9QRMhBNsNxZ)PJtWJBKX3!2LKlNXQt^N znN4IB1VFPhhq`DeY~u)Pc;vpRm_@PCq!R@}35*H0o$p`d!5J!cyW76$wkfj_2@xX- z-~jMGy{5{lXbLK%fYDoUmM5t)B`a-HdsHqP$a2W;-IqM&K^G2{bM$lcKKk&&t|~(m z5s{d<0Wu(ZRThtzSHNMQs$`@y+a~v30;_Zrrc_AIr^t(Nw0Q4Ja}rb4_sBSVe?HIS zc|0EHuSfqr`eR6UiZr>o6a_>e10kZlz@pp$5@qN;MEF-^t2xuQh(b+6*muAu`S}t# z;X9!+h2mu4v<>Ifm*k&DR)LWzs48nl>${g&i7BLP92~ zFA)O~jU=taUotY~9jI6gmw^Vg$`@yCepNvIo|T`6b2Aqu11o92I9pzXdo4yfo&aCa zPZBe_e&y;=D|2>Q)SqOp74V&2+fP3}e*G-Jf9tlZzrz3aQ+KfJG;j$TT=3KT7vFbr z%_&?r`Z5?*&Be%=LRfY~;efJjD06ya%`H>*(tOC>QC?YpPG%REzr9%Ys=t~(-#R{K zHqrgWI(GdZtAIaPYHP*_9dYHsV_b1S8# zJVUuIglsX{v(~PwzjcKjpe$wo>c8u+mt9cYQ<{9ZR<+7w^0Kei_{Hk{Q#16*{(Rg2 z>rTGR$=mfc|0%j{y;VKvcL&D}?3@9eZii3cuWaFPJRme86fr|1L|Ll? z5JM|LwgqwW(-{_x8e-lXN6kxLsTr~=m_?Y#=;-2YcF?@FZER4g zBEG(d4b&^111b^-j(A@+6&oTui&yG$gG0f92nc}*TZ3IpH&F1%A@r^|ZMWMdtyyCu zRw5;EsH9-S6jZ>}#@HI0s&9QvKYh53^Fa9$l(N9df<~`TL_nb7`^p1*y?l_Gs0>pz z6t9$u=pk%EAcR7s%+Q*)&GsD)Kn!lXY#TOaW+7%IMH;T4%}kX&&|O3k+=Xa3h1C0o z$|H-5f~ybe8Z|(R?lJ~o-Z-&$8KUkSJoild90ZGsshEyFo@YP$IL~n$<2dD19T1Vu==uK1|(juO>XJurk0eX##5 ztU}D1^C6K{-3JYepQ7NG!>v*bS5deUY4sABOj(ajFa}Vjd^!g}>nd}hHpc~ZUNGw03(S|z;FJ{HFEah3;C}mXem6#n>*FwYZUivBJnQ0-f60i; zD_w`Bj!IK_x!`@wFRsA2`DCyPYfdMX*_^WvZ)yw6S365D1qT*W8~{K~Qu%zK3bfK1 zOkLw@#ZIO18L;5WqLtk}5kPv=J#9ClU{#_|WR^sktZ2;J@?w*mm{vgGl?v#Y`?(^D z;Dx2lyoU?CvOLM*EiI{1@+2}Vt%aw0MeVA-q7@thcI4*I&cUe-6k%;yx>m0SIE9xsGzxg=i>%QRF! zJt7C`SJ0Z_^l~;Kv9q_q@wsc<*ld`1H2_eZyR`hdXka#mc)U$Rs@5OiCItDsdax9l zp{eO9L-8bI69iQdHsLX_ckM%aA7}4&#%=8PEY6n{nFBp25OK=As zen0J+vXuaW!W!P?QBKiA)C7n5=>4MS;JZh?@&g}PmYT4pWNoTeV2L;75=HF>3p$bBhrQ~Ig%nJ8KWf<#YMAv zDXbYN6q;a8b;O{rX8T+WCo(-s-umO2OL)Dm0EzrE0b5Ng}Z9d1-jKVR^bn+xy^Q^mp8ip9&|+jbhqWQg6`sD zTC#nif++A}+Za~LY8AIz_;1Xz_^(Us=`t2Y+%0nhAw2RcGc=D!+#IuT?n0H+T=_%m z09_cSn(e%@3Z%!~%Pg{Vw=JEgeRAx5`L4ewY)T~ia)efT^tkoePOoV4r5^3 zm%DxB!`_xdJ`UsUCgI&N3OL?w?bc{J&)%h*b}$bap|a@a&|Q;JDqM5k3(P<&)(_Co z6m;lQ)jAA*mi5pxGAv$DWagEdYM%N6)L7yc$6kbRdFBGryvDkQ#qYZd*98vLq@MPi-m1`!SGQcI zAx}OZ6DpMkN~6^aa6?2+x%IU$Qz4eej!-eZe3Nvf9~m9tEr`gz66^5 zCbDW4G%5GkWN}hP{ow}*(9*e7=Opig;PFo7{`&v{*SC0ouXinYampBECrevzzRuqJ zOs-FVsTo$cooR`e;i(IC0(Wazz|*?kz}vsXH+13g<^Yn>D>gCbI_=a zq6M$LcVUVCK)`@roT+KoTq8saT3wfBu^1f}(X_8$cDF&~(%RcX=a}Q@1%~}p>G#k4 zv6*=T;+OsNa^=egs9zkZ|L*=DAN@uE|Nh4ff1s#GXx7^Hg+py?Ce4II4>NJcP2xR_ zKo!r6lYz{L0E8a56=sVHhX2U`Kx_yY=pfxdSUYK_ap-x#ag5{a$2qzTmk-QDjSzsS zp*PZVqdmKy6H?S!G$79`L?&#E-p9TXHR9$$)A0+FqQ_n4p4^OJ7eGQ1Wa9yw!ib8B zw(Z)Qw2ina(QtlqmKIVl0udro1pm+6Qji?`!jIRVvXwkQx(j{vAgx>P=$B_xMQxa4 zEExzLw1Wx401zZ4vev*%K$QSgjoBJ&BVj@&WCBDnYX$};3arR#s!C%Jc`>tykFnR| zm|;ip5(~!wAYrX!BKzWr1jwSqL`Ed&S+&z?gM_9M z(1akL8&pX0D@N$$=2&~?`g~aT$)EJWWUAkBl!Q(W7Z`QBL5{^JHN z8QcKDdc^AhuEb1$`=#wmfv{KVgAPgXFOLX%w z^J8E^ihp2C|6nAn@AWcEF+H5T!#D+v>=B3c%?>_^n+XR=pW4IwT{ zW1S|6ZHnj>2t04Ob`%s*mtg&ZA!eKqmZvSjjzRXuTlViVhvlz;ginw>cwUT4t;W^< zPF-Y>U8Mk4m7Kt2)dcGax(eSvpqwBBUwnvfl78M?XJuHM1r$qX_-COg7wKO>=znoO ze$?yJ@9`2lHE$j>oPsV3cGv7(_4=Qc?uU8&!%(Mp6oU!=G}Vb;q0(O$xc+u$TD88e zay{`TOmAC-4nS1}1G@qsC=PpK*0d1{SG`XA{2h{U$z5L%FfXV?-*s-6VY_-->N+DslMOscbg5TnR8*1R*Gn);{HJBt`~pYT`Rx#VQ;Ig@aqq^ zU19OZ-SxUHb4U92Y+Jh#G|4| zu4-eLcGFY(X>!7O*!i^c&^}aLj}kJ|;?)jM8J36+Tbh{|h|MeL10gUX0X5*pyz{nE zYs~D~|A;`$l$|RL0Ei74Xb`cH7!fiPiwy-;Lo#mGHf1IzVHzB@Xu@mYeFzbn8e@bg zYx;;JQtFfdpvuc?guUouKtKvS%BV%lR_Gqit@-1*aKlW%hN&V5@gP+uH8f)*Fecw9 z!i0Lw%G3_;1n>(V=`7_sJ_@M+@x zF%1+62?>nEQ^p%Jf&s9aHKJhC+)o{6MziA>dKI3ibag#l&g`p#3BfGFhw!Q^Dxk^$ z6v!)s(&9hCsF${;m9K|9H%?{D!Gs(I$Fguzh%$)r2T)UIwh~2@zzaWF3KxplndIjvm~W34Vz-u zrZ+973e%evm8SCPGW(!`gzi5aVeZPKQPS|T{f`z%9a|(&)Yt{km5883w>_6~_zI^@S&WnrwS~@WmzvtiR(64 zEVntZCGhPH@8{;B3yXHy0B;W5+=OOY8I1o{#0SaFs!+%yh`n;MO&0kbs*>9{q- z4bCTw!^UY4@e*DNGDwBkp%(wlpn4G`GQjAfXKErgx{L$mgnsCG=&UIVV?ofRPG_4CF;2*Z_?Ph=Cbf<85Q+M(!tbn1NozR#gF2!kI~)Ic|hT z45VhJh>E1l!i3CTC(Kc(fHtsZs%8vk2BJow7Ucqq#V<_>nyPNy+WE&ty#bWae<@F( zYHHw>8U}zM4kRHM#L6~|6+xAvASnQP3qPWGDI^7?=pJBXN`@rjU?p39E!|q`@H>JD zjBv4sEOzAw(*&I{@)j5}g39t569k5+0E`3?HA>w;L=eRFTb$3B1vf9$)nvqi#=+4D zt}+7?G$l|_PqI`rB^2+EN*E2cdke)z<&-24jaRu$3BanJYiTbG;N|LkO$Z9Jy5C%` zsU#AZu~msj0ZL0vQYXuBTjmPmHRdlaoYudtbZ+-KI6WZ!CZ!CxwSO^Jauy! z9`n6(W)MESRGGUMP-w}}{+_scpQ74b_L}<~-=9WBeRqkOT|wl!Krd5@09m^3GRqU< z%yOw0sar0;-@%=A{B=*&DNvXGYL_oULZy{ME#F1a+V9A3y~!I`46)M42!VOSW+FUJ z>WJRGq;=_lh#0k55daAl%+OGygk`?AqLHe4WtyR&s?w#OdY&dvI1W7z?T7U~Oc4~2 z7`*FaNO$2>w7Wt*0?z!1SE&sfNHADs2(`R zA*GB2NL?xm5;6m`7jytGOM%fv&A<^OvI2W?T_If-ZcXsjxn@`l!%W!=q&ycY%*+&G z8trn_zy{bb5JUlUibjmIu?iYFZ5!H2$ZIgrAXGF)Lj5g13^I)Owk6KvMJaAGqQoEiqUt4lN~M5a zHd-Aoh1gO)1h-jTdh#YVnWL3w_P;I>{FA7fp0prv=q?A&X&$NeirkcRB?9#??|V3M!;4bdktV^4~4BnP zn;+0*u_2t%%bVssQWjgl+bkM6ugP;c<$D2}cdI?YA{dwrZ) zW-sPD)Xe#1le!A?>xo%hbDq_M*&}nv`^WviOkY4WmiP-o!QLmpQ zopzy}pw8>EX$v}Fxh-L>X+NJERK`beb-}!GPYtQH;)9jRTZest<}eMO-@ImFxw*c% z!B<^&?E-mSADf0k&P0S9T)=ArrK=5gL1{~OuOg;G(oO3u$-()_WniDCG|`na@Dn}F zujDJgV9*!K#7Aca&4dXX0=0G%9AJkho;le8Ue}7kx`(KZ?uBy{42{S&i>M-~A%U8x zsDgAIr;gLk(|WglNIy*mcp-TJAYcUK7^xQ}4d7?aJvtBLh{}VmkO0Yu0Fjs(8HvQS zt2B{D3=M#Z*z41i0zh~pBP7^(ooP3EfxONNkufXtAhdA#07KAp3_z+3z~=cI>;GfEfMYHbrRksx`u@&H(B zjE2z>$DoRFnUMh@jzCKpIS20X%-!bPOc9k=K0in;#~LO8=BP zDHD=<+cHH(FQXP7RrH)@^ElS5xTZSD40M31yH6R^RKSE#(~JYJ@R31q0eaOy6ta}9 zOTs8k;&>*Es?eU1YEh?9v1VDn4X!uH~9jKN?yf_7kFOih_rEoP%8Nyl`3jBbOCSxGfb-x<|=yZ zA|(M3$PHKxTt*1sL}1KpoS|qqkU!q7c80{2tY0Z8C>P09jMl^vg-H>x9wF$Rh)7$e zs={#!IWJUFM4?p@;spuCK1fGpc47mfXt+C-#HCVf5TUhOR)7xW-6#$`!_qvJ*;A2f z0LvzX%S60^hIc@d^8s(~_2E`m)iS^P>ZJPMwVHl&2$=pMl;;Cu@nM{ogLNSYClt7{ z7FVic9cNg?Hsi4_fBh{_h80GRIFAqJ5tws0cdlzC3pzUL_+E${bP0y*dAu%z-#wRp zI#Sj^qBq3*;svW`{oyMMgLW~l%A|amlZ&rykukL;^AtOh!F4k8Xt{92<-xf4g{L7G z6PiVwAmuOdodJyg1mbW5Yw2ED0>EopeCt<&}LGjnhh^D=6y~>f=7iL ztE8hcR_T&HrmBi&0A5lm2t|WPyf=(|Jq&M;d0iK{q@|!D+FEnayriU=DjAR$wlYCe z(*Y)`!<~cbQQjzK#>hSZKL`WN3{=76!iHMc0cNN&bf};Rt2h8h54kr)k5)4i#H^83 z0;E)eS{>7jH!7nk5BVkA3vqUQFHxI13h{QkwQVQD#%*}=qYM#g%t*x40Ic_ZcJJ$$ z6}c=6Ng)!zcH3KPruKY3O_hj{h?u;7;}8iWuPBjl%r1kP&?JpV#1LL-;JITzL``rx z7M?S&CH6KXLUhF0wlq;&mdEjjeyWDFgt_6gK6m2P&p8 zkW{$00xr}*6G|sVS5P_eXn*ed~;9t#&1s{CGZ5JrHLikM8TL&}%0Du5VL_t)x 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

CUeT1LVB&Z^E4UL&G{<5s9|c! z%rrYjFguq51B@a#8iWIs>zWF^E}NGVSE721ae60sRUOgN_K11N}5M}deC=ILh9 zW;fth$|z){?<#3Z1HohljzwVZLjVAP07*naR3oqv;y?jZp%7uDB~qY~r4y~W1H*Ay zGr@5Cnn4rwOgSf5|sQyY3gsOO5DB{H;l`%;8klHl~3Gu84)l+0pU~>`^tiCg%D&M|+JRaWx{QULv z*Uz68QYVk|)S-Zkag1?%{`&Rn^Cy7wJXPhoE}PcJS?rvT#1k^StExIW&V<&WByv%f zfyd%p%3k_AxoD^=qv?d?D>NQv8JME+Lme){AL%qKBCNQBPAuWZEiFc<$SJ>7#pN1$ zVa4VOJ9O`}fw>xCt+6x|?mTcP0<3qwS@Dh@GfJRj9(q|5*f^c_#IW}FkW*0yHwe-` zSpuGLzb-&GMR%l(py;S_u--2eXt{^-(UaL?>9^T`Uuo2r#u%f zytVf37cBM#%fv>UxYr7Bxw#_u*XhL47N2S#ZXC`&0A}3WO=z&Dd520o>-6DmIRFIN zARs(nCNo;hIzco&>97U)rcFP4u7>KZZRi@K?@-TK;rrFEH_M&=E*W3yPA#<#jV`_| zRCa&ug3XS1x$>r0f>*0jB39EkM+AL25?$X1*>BiCLGzuC&rfqF7}JKDs0egOlo*&{ zPCqBtqJfZA?USl9`bDVvI`h7EWG%?nj^%W8r{HhWddhF^n)s=1N@wKdfUU zF2aZ`qUyj!fEXT@^0GS>RncRN<2;VXIgWFT<2cUqIL2`tV~lYOXM_APMx_i73zA~f z&GpG>-(aB{DKPJS72Fj~qIYQk;$&_@PBh$e?^fV$bhY$~(2k^(Mei>a$U%UV|3=l%x+AD#bZ1QSp8Xq8bsa zyia9Hx6bCl-XZC<7I!+6rccyHp3~~PHIfq_zoX7Dv#_{RdV=#+~ zOH~~zA45OR#~&Zx{`l|%_vXhr17NvN=gT(Jfk_k#K$PAMO@biQ2EOKw`D0VG}LfMMmig;(0Bo%i#Mz)2E~zflfJNEu5g49sZE!tNq8lc7oG(fUhu zD)ELO*96uir6R9#frL9fY|?1aF9Or~lKVvUWYRP?n`@hkxNZnYLs$K>4YOu7>k^yR zzcdF>93};FJfD947l*>c6J+c{I_RD{M6pR4z5lg}OhAN(s2{zdVj_&Dk&biB21Fo} z%L8@m>gS*NTN&sn`x?h_J|w^K5Q06%N=Te8Nt#2dB|SkU3Gs9cgDE zcmdGN8h41P73_(V1!8?AJ>Sejnx2NPG))~BC&UJA;PE)AJgQ_x!ZLU?R*{WDU@XXz zlB0eIjQAkKDtVs-jqG|aeR3u4r+SviWe1#v4IBk7^;;%WFr1G{45yN*Mc#Ws$~fdP z9(m|qs5Xgr@HBis84@G2#DX$G@^eCXH6m4>oScUphfUSzka4IUL&lWLLY_oKhdhQn zhJHMb^Bf@8|<8S}l@$ol({`!PGKYtlN>ztX#)3X&ymtKCIEZ z&U+1y$dZKO?S<9a2J5>hK`8^^$B`}mpoJZmoxPi%gbg?Du$!wA*)0Kge zEkeiQYu|Uhx`haDPwk^>1IFup`p;W*b-Umzo@`A{tW@SZ?Ws8%8t9XdQ@&2lsD*oh zeT%$g0;3kCl>!rcE*i^i=r}$H^Ja!~d5cMH18%-+#yxrqD25ddZ*~nsBu{Cn?SrZ>t+qo8 znQd?Fvy+u%$bwRW^$W7xHH=dP2yo14ya*T-$2hX)%g1c)(2&`(Cw=!JW}bCCbVQ97 z6;&kVm4M+I5KwQME|4MW6i1{J($@mVsO>5MWO&p}MUJ6k$T%<#Rgp17AfB9O)2_>| z%VbW7P-Tqc(DU2Jw?Dpr{Oxal`{R$lfBXKokB>hdAK#CUbDZZmjw9+JB&HNl@({bg zK@4z+4e*4SpInk};VRery$eFCdhb)OS%FvN0U9Jxf?3ZV${1fthKR_3O467rmFF79 zSm2d_ji3&;1@PWlaWknj=t^TFIb;YJxowe~#bkNq5H&JURpOqNuHkV5A4#6}w&b*h z0|NMam`No1SS84yM61xG-;$IEWE9EQD&hmz1+S1ed%b@#ghr6Vo&IdU^9*=W4a9kPEjvd`W(_|Z$4y=9zsSTK!=JD7zOQqwQ z2VCren=7M0jzb?G=lAaz$LFsfhQaIs;bVAwJRXmSo)4<3>H+=n*FSW~F$RHoU2{$y z0-~ax%zyJA#`3S@%14$lP3u8=OK# zpjH4eFK^=g_638LO#kHdn&s5>*~mX5G&-^El-pf4w6P6fpIHA<-?sUu1!~Kzwdw5~ zRqcS>yqRrOMTL;QuLIKMFutM*D+nmEc!xV9c4vg&{L_Pso$q`_x+^WD6>1*?G6|c! z?Bam8Iv0id0U-2DUq-b716ewYAbzciP&K0-1rbP#_V1!1rbA??3Z0%hMqn&YK=DAK z#qntHc+60o;}}Dap~r|Ij{8wCcni}39l}EgD5~e<_;{S(K0dzv@%`KPKfeF*#~*+D z``^C*@yEAs-_G-KjEE2(Zg8@mjbch1B2#dHCppFZ?8Kqb$2lStEUsh4?DGJZAcUN} z85*hX02aAbKB>p(;Ju^7Z!+9cRDl+x=rN?Xy-Z6a&I{UNBcWM7BM#FI>zYC!o_s^V z+k>U+B;rZuBODu#><9=YOl5feWb)A|_hDWJ0~0F)ELN1U+>vv1$d?|=O9$M-)zzJ2`p*I&M!{MjnQxn-#y2M~d%>d=7!9SRXO zJH~OI=Z_zMan9@c45mG5W92x8?;aYDVR{S|8Dlt5bJ}0M2MYK&AJ6MDaL#G7$dM9^ zBHxjLFpZla112d5A=3-W2=A)#&X=%*o~}GC8iaO^B2rrrdF4ePH4-wojnP7ER+11L z5SQs#ST6h9c`xNWRI~zl>nU7O!d$n^8eUPms1!+j767kLLgQLWKWvf2CDN>^NF%YL zhp{rUhPs)SZlF3pbX$=vc3D)!Tasxv%yQq40(^P@ujsBGy6VGd1koD=(LvQKQtuw` z?_-)P(`X+)ZyicyEnyLgVB&j;^q?C`yHS>O84n%FZDX?7N)zyrrJAELI2z3E0NoS3cF_bx~8>?1Q#*(P6)RJ%yAy- z-JA^|=4Cc1%5fZi`muMJa?%85?%k*t(Pyws$!H+x)-jLBn_)UV*72b>*4#^Gr~ z97B(Dh>8xS;hNJ!kpxtZLuCwglX++)4>{lv6%&}^Jj9@WH266_K8|na`Eh>x`1bAF z_irEHzkmDw?c2BS-@ZK_-yRi&$01{gD!pipbFREA+6heXh$CWfLO7Js2@`;4 zojdmTCJLT)9_)%IMXNv}RVtFl;d*&_#i5f&D?D<(N@djX6TZ4iU0!~a66e!fGq%`7 zl(nPd){f*t;W`M2u2qf+e5(iDrlHp~O6okH%RoQNFtIVfXq~8>5k3K#iE-Fe2dM?K7U+){oD2V%jTS) ze~Mi!G%R{u_VdTD|M74CJ`RV)@&wH6IWO-I@$2VLl4khv=bw+q z^Gcfu&M6Wnybc#%v*+_^X4jlP=c+i5W9S$|#~794=`57YIp-9?7(+y%yq<1v)LRSs zab1^95sc#?ah|7v_;emP+Kr}uFSH*`Jra1;%y_d>Ct<@BFguknf_&M)Z6~gJgt05- zoBjnBOj~JjvMAhFeXW^dzhVTz-&Xqx77DCA(xNX5rH3v^R?6|^9;A>ORDYXhE5rVJ z*!T5^*j(-n>-hK6d!sDVv(r->X6=9Zjotk!NY`!8>t%bc7goJxs>9cJ{7opZVt?csHPzM5s#NSq*V~ zEKMjI&v$<>ZU~jDl5u_O6EJAp*jvPCLM=5b6V6(Q+7ag zGRvfXO-Ct+#EkH#V8(i7Cwx!i*}GvyX{W>ttr-UJ{QPBeLWTjHpWuvR3jlz>e*XIR z|M>UkyhLPPmx>VR? zMjiU&=a1)g&Fd=KCcH_8G=#^*n#lq=l;*-Gzm((80BQvXOY^!kSEfUCjSqG)5Ok~u zDz!G*{rIJEUkjq8zmNhKC@}c!j6!U<%6DCpY(Q)=vq6d>LC$91WJz1lTPc&0)k1#K zQF+f_c=_)wt`E!68Y~G$jBlkMra4_;`%RsmCG5kcfhMcYshp2AaYYrnFN4fr)ZN&T}S&t!RNJ zdr`;h86bIFv7healy}lRK()z9JtCq5*7s^*|M*2(fGn>`eUXZzkO@L9N~Z7nDrRC> zigF;t;vH9pcSySLT~BwB;9{IZi<$?Q#-$v{=t9WoVBxnWoZZVC$Ii?HVLh-`6B;){ z+B!*JE}Ml#QdcHoWoO5rkRr$=G=Xzh^n^1e6r#|CI^-NWRCEjxs4BX;7YJZ^zR{TO3Rn<^?QbIy597m!@iO`$)pr|VNklVhkr^r?2uV~pqXd0kJR zhUe!qa^C5n`8jRcG*Jb>>jLmoetEI+F$N*my!^n8%ZE`qbGh7EE+H#M75RKDA&}~v znNgFa#ihp%_r_O|!L;0IW(rh2dp!aryGRnMMK2}(ii}94znORF3EM3;SDr!aXGv7; zezUIFMpDc5^yp;QtxfIyg#wwmSDU?g7iw9b-}r`fAr?nmWQvrQdbQ(NcWC8`A^FL8 z-3gEOmD_z9hPXedu?{Xf(RTdxyZ3vx-j7=45x5)Onw-}Wz8UJiChYAf-_6kt8{J`6 zhoOybDY1DI@80`Rr0A_xz-l-7CQLST=otRR;~2pMsCw}x=QZcNuFEU0JAGT(+{7cwgay&>)q7Dnh>OJ2a2B$^6toeLMTR_%L-i0*k)f)`I3LI3IL0_m9ft=GMTf{Z^cX7R@D>cm z<2=sucpP#*#^a&qF^)q|H?BdSiRWV2q|ECuBd5|14_K&rZKB6`1sD=NPZ4SsrAbSs z#7|8QJh}9^#^-5-S4Ov}9KJG|oRiC*6g7l$Y9f3VLe4TnYa~_Co!U`T8nE_4I_oB$ zmOdnHOH-Gcd5lRBrBx20FL954Ovr=zEVBGFQ%0){F%bF4le5G5&lLRB3r)l;0K~LA zOvoY$Lj@+zqtR%SVxWPOn0+H!7SGfXD=MlQhfJ0DrkY3sA+%Wd5+eh!$r;oh7LQc= z!Qo778ol_+3>TYuSArBl_MR)5S{T4bSS=?2T-Oy6XII_FF^~u@t5Da{E~`#24vgcB zkY8x+>lx>}&pAcqy5`I$k~S|-QJ49A{(L@}7IxrSlu#{$`gzIo8u2v|6)zb zgw(s-U_m(^jk1!&Y>?JJuf|Yc{0+-O*`BqHE04FiA*44P*iPo1I0^ z{%!KtD7@rLvQ^URE5UmE_#OJ%j;n}>eNM1vn{mBbCq);3(>T?Fo6MvHyo@@CPu25r z`ajR(JkQh2MD;jNm!I8-#txDFX?>+#aZT|8E2m+!!XdcgYID&NX(d zwphs){*%^nJ>rkdHKW|-vO{hXn$Tk~`@hUsj*6}#U!$W`OVQWv$ zh(4Fz02#&_kegQV?l6`@vd3s>%QkZ|R^aA{fJa_Kb6kW9WGv=c$iloL*>tj6+mK zhCqchGg3Ik=HN6=V!}_p7U3A_e>&I;4ImJ&mqunth%ES}2~-N~YXS+M+wB}fz-#{t zus0$z&JR?NDTLyRbfbv0ECAL8KecGaKA7-4VNjGGsty8?@1DMO03io4tY&L*D7{2Z zx@Pu?x9~{>m|%j0iZb(s-_v$UI1i^iH$hLfFq? z@)xnZ87XFdTDjY$q_vE3hhdr2O7ET$>Lee33l32a55eV2)dOb`tDM^n>_2Cm5X0=g?5RZ3UR( z&aM%58&N2AYs{EXubKd1e}yI|J-W9`5fhqXs2UZ#+3ZwHG1@##;}$vUe)onGZ@93}QoMd465kY| z+V>ZK#e_L{6@5G&?q)tdKF;$b?KqCd#|K4z{rvfB&N)?7WJ(~R1nw`=xYIf7S;-w_ z&Qxws){8{iZ}oRw=PM*Cdck%gi_Pg%w89QOu2(bmiZ#pGe5D&*AygLStDv^a-u*pR zbz?~d0FM9kpZ*Jt*R*Mq1~Zy@hbcc=#%N|EtP)pHEihNOjAryhRn5GwlMmRrib0N{ z=Q$pa<9v+s9Af~7ipn|0@i@kzI!-4mAplBq&R z@Dg&2XxV;7;82}EQ&82Bi$}Vqn2BA=%Qy!ngh43lK;jc-9=Cw1lJUDt{?2VvDGMIF ziG&XwK`cdkigGdC0)xPia4WTPLC|b`JPUFoP8M;7RH~tWEtF*J_9UkQ4i=%ca@<>; zuSgBkmLO74q0B~Qp&}cMgu}#yE@OV$U`e`&z*Y%Wwcn~oASc%eAY@~UWkq8jX2A>z zD>*D|4+uCwdO1dHzd3nLvuS4JWc+g3v^k3a6mOx4S+rfwa?{Zge5*B2z3ZO{<%Dc> z|Cp&$a>+KOj|S>2WuO3O>Sp5t$R9Z5K+~m3glX^M#I#=x=W7Y zv1-@=EfV_{uhX+@A%vep61#L6@};5;jbLlaTG}`I&yDAjf-;V5w@VA|Ejip5TI$`} ztzW5{T|(Z*`)<5c=!`;v$*nAG)L$r6<%$!%W38}1k*mc`rl>7vs}$VZ;{STnM5cF6 zXxj#;47frt`vd|&o|L>|Otl8pCZ~nD^Z6FUVRK3Pz3&Eo&HR4CKDP5=(r!@!qB{CmLwKsM8S=SsLFAS^E@7pa~yIUfLbJ>tS0L4qg1?)gAN%g=Qxg`$DzleBNE#I&IF<+ zG|-Q!bf+ z*^kO~LYVNdpM6(_ADKheh1n|;HUMVHk!OXM#V42QOy(?NV@wR!99fYhw5nZwrht`6 z%GX;#2kPo1T`GgQ@j~b`m=g|+SX2)ty0@t!D zM_SY7HLpnV_-b2`EH4TsOj@H)Jl7DvZ@Xp3w}4Cv(p>a3ZTf)xOYZmCj~2N zP@2|vx8`E7hbR31=SjMbOxI~b_adex2IbH+oRI?fvYKdDYp0s_`vyB#tYM`qZHa~( z-*dz69iY?@uxSvB4m8X=_E_pZ=Gz-})~6|=bsr`Z#1i-YTREUN7%@E#ygs*0|042o zjqeUg);1)M(wr!!&~krt{E~9GtaADz;p5#1wT9uA70>1!eX-b<=Jf?@8tK_q*F}P6 z(-W_rPctuTiAKa5XuF9S({C)d$De9uH%uw-rZ)xgb;(KqO49EGXqA99=QoVL##5%H z7Z!B&QLN#si_xC4sMc^6w*)WrZQctN2?&n={9pf1m)V>)r_Zl}#%b~UjLHI|`H4AX zG{s^>eF4Jq*fi!b5G8JYh%kubJcf?rbi{*bQ94vrk0Gif91s!jISGKP%oXeuN8Gj;XW^U4vUh)|~qC|5%>K$9NoPgy?jTGR>akMY(K#&iS-?nO$bj`TV?|Gp%-Qx6&qlDr#|- z86L2l4H9UjC*0FIQ%$h#M{V@dQh!AfrA726VT~tDUCbc<^7YFw+TNk3lt_sCZqNEJ zTnRc()|QdQth}wlaFQXE^$=e|E43M=1qf|ab$kh-P!`OpU~b7R15o9>ED@@0krLyu5KzO@gzSpwjyM7T6GE#HMpGvmiW$e6u)7MrJul{}aj@EPaGc zL%pRM?)fnRN&Dd{z-k$pH^X;o|weGiR zOi}0`u?Ta9zKa#yH*61wW%^OPdxh8_>#{xrbJ{hpQ%-<$&R;)&O2!}NoYyt4=W|}y zv@5K`UYohdn@&JhzX?kMdT)iW;ErrK^@f{wQehLX8=G~T`9ho>hl;M zlamzHda*c1PrVPjs>&Fu1EO9$FMe`OQh1Bq4PX=i%YVj@rH(bc(2Q$&;=GO_b^1+Y z@rVIJn~3Zvf#&IG8Uh{XQ!4-&NhqjmBX7Il$tT{l5`H8DU7_lQ&qZRw4Lqm%g*?@{Fov}JfyMh)*ODJ8pzriBp# z%7>30YDLRncz*~aUVKg-*POquYnn}PdfP1@pmo-L)E?@5n0b2uo(^gT(Ox2^WyvIy$3_{uDOp*@Z9h zdFOsIKxPfBq&-+E5vfYr4Ks4@HrYx=>`1+?{ta@ei|Z=|3*H0@S1Qzc#9L-@6Xrc- z=Vo7Pt@;h`VCyAR^foq%!dSN#Yzk~iQMgTe@kG8ysm7Hq`L1JrCrCQ=l8}mGxLq0> z*5>EuCjeD-CL}l!Ac_aCd0o#^O|KLwN~`Qp34k9*k}lP@h?U^m-=e6m`%ASK*&f{( z(~hCviWU-$;mtg+1&Z4)?bQa*Up(P#u4@|U0Cn~GE=&3G@h^Y-`{mt*BUjiw5i2|! z!s1`_V4?q(xf83)OnwDiCzl4p;b}hQ1jIQtd1f=h<7AffJ0eE8ZW`UEFcboHLv9H6 zncmS8RF$DBA_EvIevk?bqzV1V8-bV;S`?~gyUQWK(BXZkElDhwJzet*iH@S;fJd8i z$?^=5X9#*7iYrHYC&ftd>G(G_Ut03z23iseJMWv?G)-?~^#Nq^tor%3MSU@Vyryla zV|>yZ&kSi4E0B-E;?a_TqLubu`@`ezK6@T7&PJ@@I+`kpgp8CXxfT>cf8Fp5SJ9U% z_sD#XSrCC28mp=tV?552Fjf3gF&bs4lUT%Me3}gva+=K<-O(>Io7Zg3dL6P@(`qjM z(L#o#$gn^xbT~V-h>wa8mHm?4U8>xS07l{bHQ%^WL7T1WE?g}95*rE7T?u!09Z}OL z3vO(-XGaB1}rGxR6{g{kraeL_zyI!otU37HxvF{G#3AMzN%;w~Nxw6Sw#36@?7) z-%V8kf;D#{TZ;ES$v|~Z%SXJ&vI!0rz0~(%s~82KDrWZc$IlQTU6MyQZ(`9~h?d4{ zE#i_??Hg`ECskc?oCn_L+oH<2VGTR^`F zNuz)lL5>aNl@dx-wYP!j)ia%M2aogP+c47e(=+a8oQ|L9280B~IV=d)$04r-qDvVN zpe7?w88I&;C;&{=YwI*!HHi0ks1;98<+_+rpof$TQAtkDrNzx#@}qN3?;Sb=r3!{j z6;T+4s^joO^ZX!1*K6LHzRvd}=;y}JXo0jUMkJCPxFmtL>Uow14y~QQDdQ?7l`Bxk z+7yL&Vkud{jf@N$SzoBfrT@9s*jLR{AcWZ?HQEHMw#d>zSm1+|qAqL?T7s6M zi?26*ASuS|x>|Z+sl=FsG-p7h^E>^qHnTL}T5HcV&K6J+8$*Z5G4wG8?GV8+#-Ycz z<8gVF=or3No^yWA3DF_L$Z5PdpL5bOn3ApsSquol%ORBJilkee66$GgW`G|qAj~() z{451#Q^&78sXOpeWN0;-9TZ@2`GzrCwaQ`}x;?(L9M0`5epC`nlo}F|mMiBTPXWzD zSGh)xH8fi0m&>ua@)F08F9oo1?^1OQDNm~^b zbZT%n(hVWTjh4KM*vjg-#pfExMeTQ{>zCpxkgTOGEz;1a^r&b(HvOE_asJ?lwEF&Sb0-x<$ z_XeK0trdPV+O;sZ!IxTmd8qz}$OiiZ_6Z6WC@{5fg|EmpoDR@-ARbtN37rjWpZ+1XL0&Y+z=Qwj+XUg%aGb zN}oLyU6KPaI>uTVx~peB_e_g~k2Rw!NP5FkXme8g|6Lwfhj9y2j>aw>gP`jp#u~dh%-Xubg>yayd`p$)dDM1qB-wA zj}=V_FV3pY2^n0#UA>oltd&nSW@&5-6R#HT$aaiO^b*k*%1r<$-VCAfV9u-r=hRU8 z(qdBS3Ykyrp~i)Ti!Kn^U&LyN5yU};a}s6&Ss6g{*tm7k&u;8U6B1LAxHCEgRlDkZ zQgVoqz7|xLs(7X5ppG$4J_g6d;~eLl_OvZ}Od9cpE?}t5SYxfw=hH#n+^@$Q@mbUG;8W zTFoHpmCTa7$IWH0f5yVq9$qsaljY@3cfgVB-Bk6;fkVb_Zi>8k*W94o9?P}OUeO(E zR6DxLnGnfZ%-VqQo`P(cQ_3YqYG$=e;kz})rv)~{ zuZ?Q~b%E%`qe$Cgh|Sw9dTp+jt0PfJ@(y!|h&a#@WJ0qSkzI3!fglCL8?|InnY0H< zb|rZgh!ykGRZVX`#I-(((YK~g3mwBgI9kTC^v=ppbB zqDiFuL>w(tTscame5B=eL@36~+g6JPRvLO4u~gQaC2MuT|K14uj87e zs-ELKbo?4tB?uwGaSDOYf>lf*-FsisT=O&vMjk3=0gJV8Ok~4X{bszOmVs$&m%T0X zz55@F6y;Xn)1r6_Gv#VD1JfE%-C##P`>taw{qPN4?JB4q(fpqR!z6>>y1h#3pY+cY zPZzV3JR+IiQ(jp@4y3c#;eS+#Z&Yq>z%0Cy)Yn~w-l8F?Q}ey6+#*B%{>|+;Zlo8; zB*TLTMcSFL3&n)20NJgsWD|^%6REIE8Oso+Wz08tA(5oNX9n(ecg35(N>#blaLM+? ze#6%Q*4umD38a;Y@Y0*D8Hq(Qq$UKGNnT&Ly<-~UK8|9k(ID@a=<16fk+cYWBiy&S zEjW1FbyEK?=2mW>Zz(?goW9r4Sl95}FkF2YGvtXqs$+yHGBY29>WDla%U0o{V+?qw zM2MvXnwe^n+EC{zkPr)``H^pCU<8){M`jkFB;PvVnuiGD_o?D7Hm%}={Vi(AdVGDM zpA;)3SpsQ!kadT*WYrB5YkvweLtqoUo+npg-;v+(`1pg3xpH5g`ES>h!DIn218wr8 zCt_JxCJFk=&2Z-1F9o<9zvR0z8>1{r+WC6@fM}`=5Mu%4;4~GpQRtKyqLBuh0wXP= z94dk#dG4MwMv1J`A~B2}f;jTz;cPh&-c|a9tIb`ja(4nN-(Vw(7HI20r$9)SvS(Da zqpgJO8uw}pvtzkPr0)t)#PxQ9>|#B(Etf*Df|(^&OkrGQt+B6K_$hN}!Y6_Qc};XR z8Ul98OQmLaDU(`rNnbnWCDpDY?=_{dS93B!5ge*e<2hVn)MyhVqWcEPndHgS>=@TH zj5w}%JkBd&cWqXutLnTs2!zfGNZG$UpE^D71dOXejViWsfjd` z#lyTg3An_Rg~^=jT4xwb_RCEtvPuJT^jz-3#zC#)45a-rT!J)kyd`cGb6EBusX!eB@9ocfR8eTD zr^4jB^h(S&RqsD3OVa_|mSH1oHO1TYc)4TKkn1V0SN0EMX5OOvWDq;W)dJT4CkdVyK{0dXdc>P*n~+^(Z+v8jTnoJZ79x{e5eAJq z$4ct@N|072R*rC8kJWGNRbV#ZCyw#>=5xYCQQp2?aU>HFrFh&T1i>%+-hLt{NUep-ja%*~|Nu$jlAi}UNh3|#lTPgub{s;EjMAZvqfaA;8aP(Dim771PF;dTcfv| zknB};3w3J&sz~)ttsKA567@A@!d4NxQc0XNF2<+wc|+4x7$vKta-xuM5Yih~}Ry5OfXX+iTSt;LZh`=L~D-|Gb;#Uf?ZD|uB#PNl(vzvcW5$N0i zwN03Ak`xBwGMNeUmnH8ro4dPbA}{q?A*?%T!c}O=qJ=thR_tT(74czVw|v1xx8#Ff z2x%ZZ06(@YacHvvc=yxo0e9=n+6euv-f>hJuSTBY_dXfxJ&d?TpI@L`Bc{yRG%>gI)usnN-&rLAf2MExB9k&iAbQ2jpd4eCKlB&EcGJ zNN5kz?e7(e+gMg3w)I~UVmR`teJ_*1soE0L5J z*=SCtq%~i+>#@8B-){(MxkGIhIuCS5TC&cwE5_ujYwlHLLNrjl!#mBw@vq8=sMRDW*))FIq)p>=D24d&qS0*9 zQ5G#jnVvr8a^UQhV;3Wp?FANzgw+Hu!fr@S?3oqu=k!LGL%j9Dmjy6tiB||PK9v>) zwZ5kr-%i~doK_jvcz7jIVU4HdC{>6t{eQfuHQ63YFk1+&RM98`PwN8%Koe(DWa%$S z47SQxihZreDkQVq1vCrVY2CeV`MjwZ420LBq$P~nDoOjd?=F!H8#y~h5H`SaW)U?(O?g^tp(?7FftNg#|0Yn##!b}ztyPP>G5tn8wG84Q$XIafsBnfV6 z867&XfVwwCK$3I0cGbtcCZe-91eZvqeAIuvENZ0|v`|*UcaR+GoTyxj9<57#*li0E zy5|1awrC)+rH&VelswZib?8_j((!yDH%2KdRfJ7jO7qT3Rrzc0-ujZ4ddeazc9CHXa=r)Z3#~ zcV{5M+D3F0LGm)rT9I<+`eGc>Y!5=OB#(?6t*C3#2~Z|laG($oBVn{fqEG>YS@n8J zpU@(wDu9l`Xk3j=%_hvI8SRSJ@pDd_oRjpRpyN5rc`>nCzCuN1Vyimm0k@R!BZr4E zsgXz`FE=(!k`cO?pX7)lXLEE!Ze_O!Mj$CSdlepafR^`K^t(Sc@_!>cSQ-$DX#2`eKpxWL#zN9;1LhQl zce(JU1=+fO^X6A?gI(eJa1~X09~QafH%(jh9*gahQzIe}9j8bHt#gM;9IJ%v?J;cV zv|%(6wTbgMKF(89+tCafZE-8ISq-%_t(A$Yvt^MV-INj_Suh_m6Tmm#-fLM?ZFm1| zY1SaAJWCYpdp$5}R#~iYV5*Q6QrmwtJ7gl})>klcXT{3}R!u|Fa+PF|O}UU{S1w;x zX2-&4(>}c((5E4z>k+HY;A8cgDx~jk?I(-psWpMgGE`8`Wi~7$JtmE6TU9~PRwCS; zm|PNqx@SIF>e#e~EBCRh&(t(ocp=$Ozm=cVU>2vj>VlE88z?q1y(-4o%E6pFY(wB4 zMr`0C^kL8J&G#?&dS&TumiC5Y^3HeY@RbquyqhYrzs1Y?IJbb^4K`V>U<_-% z`}IB`_v40rddl1(YD`8+I3KCN#n_~ zJE2L#+cbkIHFKma$O=}hcd22}nYnDglBlf6J2AmvDM|nl?{f>B8XV#QQ($sts9@D3 z^(8FSwHP$(i|c;8oTCFpv!O1*o(9tsvx0IRDXqKK^LqkL*?IgW@2Mo8-3lF zmX=_<+Lr7pBB{FNb0*zF@5;LNyVg5zz3}zhs!23l$cE>_;yS~QmZ}prevklL@Ohi=~a9Bf1=K1S3<#Mh?U-I zC*Tn_2@m8^mVO187EF(V%mzmSHJNwjOVL`e23~x!%_z`Zox=K+WtFyp%WqyQ zBMFff3mAK|nUS&;C4@H~vUYnS!K{=NkagZsY2+kP`%{-^U5?qF-32Eqwn!WjUSj{b z{k!>KC9$vJrZ4dpQ}?_}AE^2Tpk?4q{1R?7&l%#Kkqq7ZPB}I z?tIyMa_+V?H#&1;m|j+Gd1x>E;^ux=?c@>#ko(y zD*^S~WTg8&H>}r^-;V%IF>Zv|EP$ms=!Q!sCceDNK>epRX2m^=O>a~VdCA~`*c4)yyfUb z?^i0F^yc*1H`a#i``SIv=L-=K>g#rvLMZo!~h@@JjNJftTfxo?W#yr zB1HyUBgUobj2w9qVN8&~R;nWy?1d2m!v@LN~K!R3q|6UjQK`rW0sEn^96m&IJT`Y=hA>|1rePf zOTnut)i@ZzBikm`D8yGmOVw3F&X5VpYMBDxaCr{3PeZb~yH{PA1Z4?oucM8#QPUy{ zn$0e^D>1(`zMHi?NgVxWVV4f9y8n&0yk))UVhGq%!I~Dha}Qho_k4QvE#p`ah=UX@Ck$Y(x(ohw2jjrd)d_CBw`# zkBDfL7A+Sw%>oTxO+{#28ixUQ-6Q4aSJ8Y;Y#vJ_UWu8MtVP;+WI%>a4&rGED4IEM zCT}f%QE8Qw-qK%MYDjT@%f|^)FX;&Q5gh)q%ns3AgSfU(atV-|jljQ}dAG6GBiva0 zqQo)Y%L{Ih#G8jV2MOyyhFY5nfW|{=yGVgibu8$Rk1nr2|oQf5Y>fLx!5v>do z08uGvmH|SII9`fsi}~z1NC-YtL@dIJduCT?ggCBzQCQmu;%MqZLXCQJF^un2h`@y* zB{9lo%L04Q3i(yZs9)Hu#v;ZlCAP3^bm8l0rSDK(XjgxMQi@Hhh}~1>-E~t+rV7Ce3nVC|8CBG-l2ceZg_{qq1IA#Zsz$$!)$+Q7%TQ~ zDxY)~ehmJuhySzAf4dqH2F~(O%235LYlLTcSvA zORSl0ZsczOQzzc4KT2P`#VIyj(^70-U-@-K?xb3wy=oP<%i-GQ`6o8pn%va_j)Iq) z??ZTtw_d}DeSNc1_%>T&FrkRvclJthmyYy6WCw>5iMC84a*T1LNwz!{XC$i??Wa7D zMi|s!L2A+nZ$4ypV9@!kVI-9^dzR9?Cee#PX~VqM&|ox;Q>1M;&v4NUN}6F_f!@?} zre#h*fH7zmhg1osnIaJpLsTqt*_?PXn9);Tm7){g1AruHQvEH%U?$^g6)y`+Vp1%h zL>H^12;&$UMz%gs-0(VDUlMuhow~`Zj*fr zJ2kRw7|Z3#1Z`vyLwaXjk0g14%(w13y-Uy{Z;<4?C$xwUIqj4y4b3dBq@^;-8@bgh zJ4mVkYBLGT46Key%OmL;C7aty4y5La0*OO3YZ9dvjL2k{1tH4BN)|UGt6n8^+CDF{eq$)Ag+t$qr zA}$tmX)a4BmKm(N2+&To1^n`@y%?{id^^s_|Ba!PB&}gHX1KfC#Q}!dZbFih`iAgn z6#z*s)axNT2xT`cK^24Tx_iy)4GLl*s+^QZnwvKUCAHSx zv?BbD`>MQ~i#HSXo4D%RFmC#&3)&T0lGdzs3$PZ6#R~A}EUlsKZC9mfGrkDF1kU;r z2DM&dfo{p$gWdzX2ETJ+@3L{I=xQcNsU05FGpP=+FpUBZEX)yCdpA;$-r=1jIlKpa zl1gTr>gicVGgA`N)7xzfZ&5k{P$of6^$;MZnG7|dlGMp7URnV&p$t`T-z7mQ_*xn{ z9d4L6oYYK zDNJ#DIs};Jb@I_=EH(-xQaHpNbMkgu$c2rwjtE4}@IJ|*5OmvwzuIx4oWP^>)>p7x^eDK?zG%5&hX|wP zScNL?GjknuyAS!WoP%Q{7GP3XJxd@cV2ka{mbfPiC`LsoI%bJ1sMo zo3wv@CsS#QtBb{EWsG6bxe2^h49!{}#l)6TgRltbo-?$)Wn(|U^p|!PVYx61IlTo~ z%Tm4rVbWIZ#@XDxf*lyGzb5b~01|`Shj)AES1{`hbM_WveesiU+HzgmvgDms(003R zOUp`!wnz8U!>uPpY#M8o>jB~EAwy%gnOwVD*7X}-m4dke%@T+HzWtx_Mrpi)_1x4q zLCGm-(_X6x6*g2_6OP3+CR7YJYb;))kUQ@^UQ`}N*HB$seUA@n@-_$LLBCu zAU#P(FvLX7rVKaMVwhs9HbJ!-%0r+O!e+!IxI2ZljL4+$EQ@SEW*jO}oQF`n;{EBD zu?ddA`~C;!@zy~fmVfn$P&Cmsk!!xJa-Wz1QDTY zJ8+xzShg0rZJRr1%Lvt8DVhsVm$ijh_um4FB=cCm6=}@y)bitRelXI1eXDSmYux~o zq%&FfNeYTt1?6zATAystrmV6in#e2n?U3Eix5&=g(M#!(QLuVfR&(D7>o<@I_uYvmH<^!7ne1Q zQNmHh2|Ip@U8yzF&Ri_x^uiCl3QYa?H!!8JSCJ4MnccX_K8z$@yPY!b*W8BmPe;

5Qvl6$<}D<`#&^o~4a5rSy5hZMVtdEJ&VX0La5$;_|H$Krm&HArl8_jX{n z^?hMLH~G0;_LiD@H*xn^;q6a-)r#(Ag-W?;%Gxs>tZ%*@m&nzZI-dJ#X7)EM{0gK& zEM$zGD!bv;;3o4K@A=dKSYhH?lwBk6=h(1*?njh6| zYUbUJK%uv-ye*iwIdv_lO#7i^Up-pp zid3z@O3MNf*VL%4Lca3R>L`sFDT}^pLfwc7fk2}jzasb&01@Fyob4*G^$trf6V;@r zn11iLK(AkGK^8aDmHCsd__FuvEY8}Ki)snP;IOFCQ*`+Vqu!tsL_FggD7P&@owHCu zE+$;|5$0wI2?ZLN=*X@hX`0=5-58#0$Q*}eBzKWMvA()!w&r!R%`GxUklbCf;<=_P zNkUP_V=mmgbWJ{NX~ym!?>fQY9bF?L=0S7MNT`zCK;Uc8mAT}6R2qYXR=eL5aUiEk z1D_E?1z0D{G^M#vYS=eFnws^ZYjd#ugGmkmRMAKrEc55{<1I`pYYNpi_Qpw-!?DVF z-|FpRhAi^;!Q$|oz-iWx_H%vU<%HX`xtVrYorZw-Ba2(+1Tg* zf9B_vrn-ZGmz%%xPZ=``cWKcNFMz2J_?1rUpTB`)XG!20o~0Ds@Vvao{7dvG3IGGxxyM0!gYfV56zkQG2O;7 z#HNUdikd(aW`x3~5foKe<|fCA3j31eYla_KjiVhB8qBjzN%g*0X0_&s%T3Y~Md(E4 z&Igd88KP<+l)1WsnM6**y3s4gN{-`ZCh7AdZo}N7%>dRpO%VqYEbCi2L1n6wFKd9z z$2!9?{Fw5f9u6P|<`|dQ6E@u>YIx9=uOQ4Ls?+O6XB6^ZVGGr16^plC#2`=!C?eGb zDWRbRddW7>K(iSs>w6-k2$Bw1XJTg^0O+U0WU93<0F?Q!cJJD3v8BcP=C;~UT9^xgLf|6M~HCZC4ro0M`J}Dde zPUWNRw^mpCY9Aw z#6tt9;u^<55^WfLRR-eV6IVz!6Q4+giPYUj2Tw*3RfipZ`dqd%FcA@|8l8hue^fTH zlQ>{QuH+1YOiUq*%prqJc;cA3l`)!8Cq=!*De|zkhD{R#yUUxp%%Mg~K~xFmrJk)F z_AfmcpGsrKX)Vo*EjyLm7=UbsBAKs9p~v-R)E#>9ldm7EN%kTomiplW4VaLN=X3na zb^P&DzuED>{w3f4?HB&~>(~7GOP>GzU-ZZS?QiqHe49G|LHfyY7B8F{f+hU7U6)xm zE-Sgk1WsYXKU6FpN&Or{2ZteG>RguB%1b>8*(D$;x?5a7qN4- zUX4h|i@j)L6N60LW_B(v9)*C)N-9Eb|LMqJp(Woeg*vg#-s-&XVlXpD7KzN_KK{@G zBTEfMApr`M7frcw22GuX0xjq5<_OkhDw!#q0wx7F)(umqu*=5&*QIazqjCkkCxXOL zr%Rr(xE@y5KZAHmljaguxlrNnYqeSq@?)8l+Kt0ST-M30AcP-%b3RpEo$HFmKyA)ntWB9t&vS z@3y4BU*G-FenC}e^938NU6i^ZSN4@?T*+!_`;(J>kL}Qg^&1p*TdDh(+59ef_xGfo zZmD25uPbe>S=9q}5GJ8Vc3zG5(X#06+Z1`=vg!)a zh_@JHoKi24gJu>7wv~ziNI&3leV8+}++S+xz6vL;91Td733=v%MAS(jPI-Ahg()gR z?^f^6(3u9w$#Ty;QYX$9RlXM1x26W2CE2u1Lo_pu%3C|o%uMpQEdQd*i&bFJaZmPI zNbuwkKOJ*vZ#})VvU0S10@9ir4DEPl?^9N<5Dg8Y{?H13yYNpJa`P;gWkCY<=CNP7 zZgJLv&(VeB((gZy|LxcJ|NS55zy7KJ%YUEa-+$u2{rUVK|M>COpPc`=^w-D7^XGr& zKmH&8$^Kve_rL$k@e9{4_>B8GrcOFm;LWGKT&Qq7fyKo5oK=X?dtyfq`gHIL2-%94 zu?|QHVOAYXlB0HVg$VuT9&jymS#y&M8F2?@hFo+0nWB+S(5_x2dQz0aTI#zHZjzB+ zaWt)>Xt{<-)-<)+UG`w?qLEm|mnws&hMUBm$Y-lF43Y#;hA$Gom;oagjj{DvK zfU>*DP9sGvFmYtz=rzJSx>|l_Qid5d>mvz&Ez(`1UtOq;+TjTwgQrSCNCj+55y<*a z97q8bwhI7Cp4kwwyj6k#X~%e`>dyxJG1S7pES0^JNei+jxJz=eu8B>vuxe^pbn>tH zw>6W@+SsO#r3SlHSIhu&mRd}=Q5ubMNb~kCly(C{+a}pRf4%J0X4j)%fkHf}3gUtr zmX{5*4JkoJrjEYE4cCL(>!+;a{v&Vxx%|sgKwtk97Home+6U{tfjRzIkKO@JnCBsiL1ZdAr5ewt=nvw{_aPk3aM;dI|*C zWT0FvsoO5_v?!!X!rSE`KGBzvx7E4Lr&J+it%zIyHfx8?nVGw?;>>97`=%S(_)A;1 zUEK#Of~+<(iL_J^Q95LhXh#mI2C2b^s;XD3slY@Cvq~I|`h1!sz2y4K(oYae-AgZ4 zlJG+^vg$C)`7$v-dpuq6nie`2}lQqKNh1ePO;^XuDm!FUS^7H%u`9F^T{6Fx=|M4mR?H}{s z|MB_PKYsl6j~~DO@gMW&pZxVx=jVrt>HqQ{|DXT{ICDzLufy-x=57C zl+{dV5oZGF3L?ecA@Ry!Sh`O#(ItFp-%FX^nd)Zi)rp(#E-QduZ=c#_vC45-OJecq zje~shUKuy({&(aQif9sU`N!p9rT9gzmHJW_f^pK4aw8tLz0)_hMAwQ!u6b!jPdbEo zpR&sC-es}679{{T(G*Pr?LMmghRwcN&L?}1%~fuFSF%V5vh;$)V8{if+3B}Na?~Po zp@|yoh#e@J_~p&d;?FV}t_zR1t8>h+2^zaID=UYun7frBn4>C(8Yr`>(XOQ`id})! zno4tl7VA;WjV#Sym(|rdQSZo&)LMxf9QBr494e0Y`Ptz9EgJP!#=a8c-vkirzxUYI zeHc*_kW-3)wX&3KeP#DjIx}!*usT@p;T!+xOB7P15qd%H`w6Kx+Cy6FPZHG6U(z?m`tG{z1_&3@yXOlw*y+PQ z=9~gi6-$hjG1=vIrGt}$yusAQG@B z>wFHi_6=L&4KNN3&ycHm&_Er2iAbe+3xG*Npva@+04(T|yKCb7rGH!>|M|zqfBna| z|MKtSfBkRQ`QLu>zyIU;AAdc6{PpwmAOG?E>(A$pKd+xZ=KK`9blU%qvp;>dEIIN6 zF?Wx1-shz@ zRsQb9@a!1y03Sx|3bi0;qBbE-DK~V zcm>iOXYXfhA^QYihRYXsY{oe6qNTm>uLgVHU%u-h<8Hccm_6@ah!DEZ5FzcE z)o#7|p1@&}GJVx#Bmvgumf(E6;u&HA_h)0s`BgED$cw)TD9;}R832V-0-^7eTmqU? zsX})_LJ)Z&@)r`XpMhy0uCv75%5LRYEC{T0* z37{SAhERn@JgCF%&EezC@w=Dh-Z|ZRUCY^}oL%oOuea;#_3r9=dv&?HKId_bbp)=1 z1$`I*Ccu~1yYc9xo~{4#*QfvV4<6v|98D{ESW1s2K{VJd;g~?APobv^yACoVo$VQd zC%pwLV6m?_o(90vsl>|H3}WojfYSC_?|&!W2*X#f0h`nq>~^qBzA;g;Z0gF?V4&k^ zQ&UP+ka4k1g~cAXt%(}G?s)mU|GuuN6gcln;2BvoeVBzJX z<@X~r#pMrgQ==dYE$J|!Ug$b{q)4z|JlIN!MUc>VeHl%Qd`WyIt*it0n29v$)O4Fp ztEI+c{45BhL`O@sh15kQt1qTVqidsT%qIYVYAl>vFH^gTgOiBs$D^qj#v`=QL8Jem zOn3@h` z!yj}JMj-HCha@F!-T5i>xZEF9a|?IgnW0&p+hj|V@Ch9=Jowg zI`Ef#X=rp$nuFQ%wq3FZG(!*D!k2E~9{XGSU;^NF_$M(ik*YCF(};w`1ceZ2prURp zTlyV&4h;hM5yQ~v*iHliM1Whm1`uLPFqX!}SwzpQ4vAE!=EWN*c9<-znwd2ZIE%F@ z0@Gp!{tQIvI*ZbIZnhX4V|(fg>ESfqHGqS)P|wrc$7mbiSlRk5i4{bm(oo9K6ae(v zI}jv~A1IwB!a`<27^R|i9|UnMZ9cBScVnoaVnsp1VwqtmJD~}0Plt~;hmW>Lk1vP2 zZ}{MBgtPT@w%J@=ZMIj}yX))C)y1^E=G_+R4n-S}F%g0XvDDh1ZKjGx|K-cGAAWrQ zz2g;6BVhq#$1Y$9(lhqZ(i0K9Ppb9rb|hi-{h(RNI?Fi_my{z~_mA4pWwK>Kz(9ze z0vz2Ajg|3n#>AVXuzwev2nHv^jk9%eZAu5co-(7WMAG_kbw(Fw_seF=FufH+=~m5% z%D1R3up65_hRb`C`t!Rx(^TzDGa_V$#x-?J-#&c_0hu7wJ+}41&`~7{_e=vCSe70! z7;0&`Ax`w9x^zg|(x9p`fsI9LAlD(6QXIZ$P6Y+-1XpdHQk9@UlXVG~G|8a^8c2Tx zwoXrqZ;3%=v16NqF=GM6efS)g%!3Heae|#QVub*}BE@3BY^kf-9zvKINz>mMDgkL^ zEAZ?C zQjsU(Ey@;oS7bLxC7A}O1?q|zki8;Ot$-byG0DNM9FN1D@$jAX(WCXj{SDndo66}L z&er4Q_4fK|v%b3AUSEyZmvwtB(^i-PDhX=FF@5CwJR4?=Orzey?R|*|kR_3Ip(Xca+=0tVFt~uG#8`w}p9RKr zn#%E}kDZfV(mUcnwYu`cn#$7=?@Z959 z;~yB%at64?ZIcm&sMLVa*pkei=FGK3wSSW63;kq&%=xUgICJEKqtgt3DfKqLn2ZwQN>gn#=?knyVE>R7C~Z=;)z1$3Mby*sbvs` zDnrF#qQj9+c(^r|!yO$-IT`7&(rThI3Ne%lSe2XtWPyn*03(A)B^0APfD6}BL}&t- zh{wX?0n~xFgN%hY2QnVPc!1+d#uf2EEI>Orst5NshYz=hk9P<6*X862Ru>aoZ0ei! z?s`3LuQ!{^tIgHrZha}cHBUQ{35CV#46I&DtjtPS0j&UtFyMr=k=2(kuIl&i7c6aE zDVPIYkj_VIHombxXyio_0nM#8uR#|bLGRDr#lj0+RnkmL&G)%mR!2;YH<85un2xa4 zAZW2oh}u`QmRA}KB5f7m31xl>e}3P<%&vJNk;u=x(EV#F2i>&!w((RbzpCeYyU00m z@+fuo(~>Q91+9;sDm#7Dp+UI!4%@r|faE%7<3M7mjTvx9SRC2-hQ~aptmuQRGp5d1 zsMv(fLiTR8z8D3?AJmm#(go63L2%uX33)VjwQpPCENJ-h&Ca32_qb!bIB;(>vWu)5 zB6+j!3WuHXd$^$h^wTXZY{Fqy4Hsq{;C66P1}~Dv*z}YA7o%+-_N_OpI1~06%Y8Ag z4j9D@$<4oNciM9cY#P-O)myNB&`vYTr(wp97LvIB?4HYkiAOOS7wOxu3zKDZ09Q`7Y8{%WhX4$`8@V7Bs#FSBq@ggOkRUNJ5)lHSp1fu+KWfaGDpwK??G4m=G*C68 z-dtEm#0IJaghAMMVGDm)k0i0fWB>t?8z-D*v7HprDz+@)IxMdz{VT|23;&3*8i-Z2 z`p{(~(y|3Bl!~hn4tM2bTHPHF?v2CorW{XnGC|o1PC%1jWsnLCb}F>CX}G#tV>vjv zcfZ!1>~_c%r2+^r3u6%k7S_5+J^-l&WB^8)3e-WS74HsUcYxzDj|0||JNNP4``4@c z*X3l5$7`X>5zaQ#`PKINdbe3`wwIUF`f6NXjk`6}ico5(43ILDQ z8o7%tCr&uLx>)ZRPmn|^8kJj`K)VEm!_$H_(Z_ndVZd;^x>nSP=kh<pilh~9)ZB^V`{&PLsp`HU! zA>uleLPQ0qFbWZ)I{bt{sLhK)BGs3R@#wt~1wos6#_r;VL$wEiR>yS{f%b{^7tQkR zk*b{V8g@nmm2m^`_!NmV=EA@TqzO{ti0g5D8V3|l8MmI81S~Z2Fb%hM!@b?=?q+pw zSMF@f(H2)bfgP5qqOepTj@oJQBvXf*>k8*@&QEH&`|xf#I)L>xj{sbO2?0h?Pq}~+ zN+KjoK)@>kL?M!4C5I%_fQ-nc4syLNcaP!Zms z@y3+XO&z%Tt+U!9hBNjB5+#!{V`gNRgP$#vGWOU|5yF!6`t7fd1x!?969)Y-6jVSW z=?5(RJotq&Wa-dqAf!|;8MD09!qvr;@AFucF_!Dd3t*rr0?cVl6`*@0A}Uk{A`&5_0#uL%wW!&{aOx~N<7BBd9=0=Q-P^nCEMt2tFPI=O zeQnyf;|IOG1rVY5<@B56Cyp7|lW1=cC>K$*%K!jaCo1)MwaqE8H4n5Wm;@#$6CCeW z_jZSmcZZMGt2-M!+~Kej8X2}ilMR7{piu_Qy82ZB#R#9{TeqnKH+AP-F8>k*VAUr zbz&Ytsz}vYLU*Sjs1acVT&;%fn`dAB$Nx7>)2DyCny`|yTBZ+!#)vNgK(rt;2!s@|6O9LE zeH|b|V!&1;TddJL21HiWNGL4U2g`wd-u3A95HqI_-6S@jP(<6zA|hK~4r}4f!idyg z!b6{q4Z}x@gYA;Vp0n<=%9pH3F%8>To}lKstXyk`f*xqYq|xF{Q>jkjbqf;%0BF!B z4l3_2(f|rH@DN~2D`f>FDm{Xa_A$1kcC(B*5kR8aPDE23q}e1beqd-LF*95l+9{mC zLA3hiGyfleI8;i^@H~v*V6``g9#3t?!)LQ;Z-Hh?ocyqu>cwQuHDnjxTP$3^FN?}M?zLe!WyXmxvZ=G9dO3- zq2fVe4jV+svy>dL4s-@cNZ-j*60IL%5@w{@Y~*iY99y2iB4uh%EN}kg4e`Y6r3|XJ z4YETxkG|y$~61!F8 zNC~u@lZX$R?GT7h(J>Y}Q_?01E%4Lo``qPiwRhGvAoKamOxhP7!XXic3b4b~INaYJ zKi(ZZzCL`gEhjrz?F2`_iJ<~iP1ASC$^y>PQuxqHHn0eZ0Lbd-;Njs=S?YEN3@9{7 ztJSftiUhll0XoqD~wbN^w50-z_#OgiVgDiZ^h!d#uBu;(+VWe#)L zC$vxOG)3n!G175Z8m|PolS35gLD*^JRtg0uAO%~LL8$?X#r9-U_jW}KS5xg*vS-do zqt$N^5*k=W0;q^;Ud3TR@*Q2Gsg2inx_H>Cfr<=81QFOnh-Orkh=CwllzVH2Q#F=2 zI}~8k6d3N&ea-eK;~L#mTTPu^8B$Yn{fxNL1xe{R3i9Oe{{j| zvDi`B&P>ISOhK@7ihiBY8?FM;bfWbSku*=iLH0nq*#})z5)g9dISNW55hOAH8sGHZ z!R>pL@C~8Qh=6Dzi1=}$@fhs>rOf6g+I^XRQ|;89ObJPyLHOFSP!J|8rRQW5;gvFT z;b|v3^~`HW>dY((-24)AX&@#e3u*^J3{Fe;TYFMli1|-$fP0dfJS@ko?}kCq6qp3q7e5*>i=CUf@MOC>^@ zy?yiRL{ZN?&7RA?K>boSu#m8It6PT5INIYg09uZ$hj2RtgT7MslcZx8<8L_!dnY6m zS4+uCI-~_X19J6u4=7cL-1J?7dQ25 z!f$v(gjqmItR2$^kH&*X>s#+{kDqJ~?rzG_4rpYof)mPQ21Q{cM?;LNN8o9*2`DTg zP!;zvfYt(6;i(FbV;!g6ZrtrQ<8D1oyJ?)JX~&hNR$*q%%@RS4Z4w}2p#lh{;6PLm z4+#&4QjiKFA|I{<1d8AWS*8iA=6zYX3IRkLpNgw%1Aij54##)C`%nKBRvCw*i#Mm9 zb7NUSyQxmK5)xa_@0^8#&>HFl$^fv0?u1IfS19*JodFYL(mkijwh96$<=}b2l5}mz zZ*SvWuUL{-Q%c4{LE9IIptDrSnITWlz$L+)th>|2Er~UHwYhJB*xg zn~hO-AQ3kO{kNmDn=Fi7fONrgh7Hb@i#YFvu1B&{r(@F~{j8!byh@AK^@?mZBIl!8 zEHBV-`_xMT0+WLAUTx}Q#Ky%opl`4y=184{dA5-OFiesXpgz*1Tw{>dnjxhAWF80APS3&LS8>OSnSc3wIx#ErVnoeg32GL!MH7K*y0y>ov^b#9R`qn6lZUIf7qeSc(|7FE$vd^9=0p*V5-`?emhO2jPtCZ*H8h5Y_jbT1zav- z2C&Z3%o)dg-*zKR0@DF?Z1T1QZ3!<9b=)x$QvoVv;6kMoE`^TH5=gb z!omX-voB!GmQo)R;2KZ1M~}waA6?&mf4#al!fFFju~dc%Shb7RfGDIGkc6t}Is%Yg zhc#)R%vuQw*IMg1ZZ@0sX0u*z*4N{9&Eu|)+dA!d8hM&z8i}V`tDcIjTZA-8kqAqH zGSILBA|xtQR%JjU%}+lVs1P9ytAiB~jyvFShvUS|C?ZIJqz7qhCWLn1Mi0P@W4-t8 zM@V#fb{Y<(c5NttQ?27PidGS#*?S|UY#Py*Dl{4ylruGd6Q+3CsGH zU=xyYzu34RpOwyf1$huKqKmJgJ7dxd-0UfOcq1^|Bdra32zmF&=J9uU$mg`}zY#k2?8n~9wYt=lbSkLl;@hX4Y@ zH13dykgyEGrIw*o9tLJErSMdx6e^{FtO^wn5JoCQR4NOQmR}*YBa7oH#apZUEO@@V z2)83zgY`-R67@{c|62qFsLJGK-3$l=`#~ix{Kjp0o)3bccmX~lkm8_`VMiz9(Ra@EigiM2xo)JC>UiM6XT?RJ~>_4Vb|_0{F} z>SEel*Ksp$H@scLcFo)C?dEdaUc+v~yKUWVnRgd@#&WMFe2n zF{W@AY6=^O093|t0zeWw6x)wPOq&e>ypxeLuPVI)3br^HB!34R@u6Fn97F3zDAvff zLrWGvvQJ+ok%s3_G;>?6I8R!${x^bptgL%$=b<+C@ z1o$(@vqqFqyhlR^W?FwgY{?OcsI#q|vOIJUELuq0j)Haw7pkxkLWrQC-8*A6I2hxP zfw3c*ID1mfrwz#`mCZI{JRWLWJkPdJRYMXL9&OG;>~s#f^{*1jwd=veus8;iSR-J2 z9wRR^bJ-+YT7{tRH+2OvXwI2e&g>hjsyi=?glC$}{O<+^1FJ6W^q$a?%k%7&vCGVg zL;sA8ea-LhMP<16=WQ{#;FOSt>_*Ih~`vx&!t7npl6SC7Y|1xtokbe82}2tuN2c*5_yI%kyz_UDwy+ z`l4Q+PgifYmuI{6Ij=8db3IMhQb&@CJTX@rvn$3)1gz4Q1aV6QKtcl@9Ma*fa(wsT z*4?994-RhM8&2+&!?@dRx4UUKRAMYpR;tlim?26)y?cTq z95Q`NRcKd5*)sHvuZF346o{yY6NArkbYK7$FS+;XXE$(AI+swqAp>X|gT^tKoosfutp^(OSofz1cHWB-ZMZ6_EP_G?ApQXT5 zVx_Z*_0$v!B}nbZYWQ^24t|>@p4E8A-*Hl1vbJc2S2N0?!5cTUBA_BD4W_hT`JV>F z^5g0^SxbtYO|)>N5k%s*aD$Xu23Un-LW9xV0TGEbB{7~#dpGEDC7uW6JYC=(?JOIp z&U6QAI~3;}T`D_9p_O5SQdLpZj}FwJEsD-$ka^a8D-0)sc;{S*=*HZr_)J8;oBJsZ z<216@vqKtv1->0ky141lSfq&fh}P6(>*8%}mTXVRjAW_lq$tud8ZT%n|1C^a22cKk zVy-fFUo)pJnh4(z8C)Vi>!_X$ZAN1Ws0Q)ldUsFDD1nOLI>Qlo%khd`-KME)F_j6n zmRi)nB!~_;pu|4nO;UDCe8;9GwT};EkX6=<#<}UW7gY7j*1Rm7ed3}95!A>!8Nf6A zTMva0&gM$?*KA19Wi2@s38eZ&q@;{Cx6#nSVOfe<$7s`2XpF+wwYwBx2g`z94WSB+ z8rv;ALqr^=IsyQ4DJWPNxCj^K%3P^TR93@kU@j;EgMcteK`BzWNKr1Ih~goAvE5$+ z&DKHDURNM-5{?QiGdpiBv)vN>EE||4;KEXNFjOpnz-6jf0V-PQTt%4xY5}3K zJpgBtgX!oUe)Plo=zH7a2Rj@XK!6kiOqD0*q0s7}ARseVW_D5->;Xckgazuv+x7bL z;_Tw|bbWTVzC5p+i|O)ox_G@kd$B!#S+Cyk=1S^T>JFuXFj^~h(cBSbI5@dC9URecFbsG|WjHuKEUU8H@^(Ac zE!PQXg@}cy0!S63l%V+LCqQ=K1j4l0dRkrMu8jVH5W}dN(qI%JYr6x45C;uh0T^oV zHp(3vi{AOVZI9+{s0_1jTKBpIic=2W&N6r(v<>WLuX7D8{;HkO1St7CiuTx*7e}nZ z9=R#N^rwH#QIv&x&<1Z* z)6z7Cj&{rMq?9y}q*=Fq;FMz;^i^myOw;3;ctbmasttyl^VpJ6yacbA_DKH|S1?L8 zx!p^Ts7xpK$jJYHd)}6|=*Cp%+IrOb_#!7rQE?P+*~V}?YO|BMgncjcbP$Ex;$@FB zLdgiWczi=M4#lu-orcNW*T5KwTf7|0>&eB$F1Wo|@=rEh)>@^VJrdv9`=niPHr6PH z+>7TdiE2*4CZeK`&~-maOPy!j40FIDx6@8J^$-W0hJjEfHZR@nx*LR8$$UI}{K8r&&24xm0TP(pI4s0okF{?|=gPkJU``e~t+at}ny39PaJEq5)Q&R~_ zw#+bSZ^j#)Lx|1Sl+@`ZHbqA2^G6ieKRG=Qx8xe<2R^2Ip)pv104yZHM8wQ>kOEwV z2i6`zL($uF;UZi_KuCy*m`YLJlnkx66%kdM(JfD}0I{E=EfxmLM z?{8?uL`1|@Sg;C=bwZ+}!<8CAW@ZpU6w>;~pp{t_ah+s+y*YjL=Hkt(tMk{}i&MEe z-=4kPym`7geZlM3xVhlEfw}`vVDBkp&mv;4i?=NX<|~PN%uX|iu+$2$6S(5d8$N$F zz5LD9@ttz}!Qs7kPab@5c<;%Apr=m_K1YViNgQ!4~vFyyGxV zs|&*@KoU0Jb%8!y=OGbj7?uX40tiuB;erVUvto^WGaFnWn6+sT04ao1Rb)vV9XQ*j zMO$>R*k}VWjt3gdk`^Cn5mmsYl5<0g;O9X~&j;jRU{fDjYZ+wQUenla@19~9CfB0S z2y}#|>_a6<`-ykXh&ZDQ0$S&IrJw~u%X@uU)J(S(vC>q#I60JTo@Q(^h?#AVW$uiZ z>>&|4ArlxSw7g?@TMrBj6S5nu1jZWvcILo2PNShZyOsk?J#7#!goF->jTZ9ZaNo_f z@4T5rpjW^6wH;%sezUYHcTzHf^Mrm)n7{};c4E25fcXXbCPj(qO~efJZ{}HBZh;vT zo6}ktM=&K1z;sE=zMtpR+Z01D=9<9LxjK2>x=T5g6)Tr{wLP(_e1!$Znmu^reQVUa z@mq^g<;m&%mc@5w0@}*)d{&oN#@X8YuNLdxM*~vltwyEK;-uaXVHSuCNuT9!%;X{0 ztvC~4ZJaXPTt0sH<|4(SEd=&!>d)vuG-xg&gY{toW|;)25*I4KOofSM5U5;%3k(dh zVje^W0Uo3P6)BoLO-Lk&1ql!t^$e~^mlBQ^pP+%3X6+COgqc$eK|qhm6XXiOk+_8b z0Du5VL_t(i@sN-2*TV;Va=)(bY~bKxi|5yTwccFsuEz0NrZsX!;1xgDNl`TF|hSKC)lcW2M)<_%0+lnFIfCEOQUHQLdTnr~oQ0CMyd zv-Jx;0gwPts*H7-Hsj^1&GXOCkM11YefQ4ek8eNucy;ID?%)Uu9S+0c$?a9y>^9pv zO|lyWNeVF*jlzJPd>4ky?z@>PKuJMBvAa4FO4b(jkn5a2>Wl_r+d?h+5j{=NIRvNM&386T_ zn)G6v4it{Du2!k%S@2DfN5Qu(ONeT-)YXph2hNQDfE| zF1`n9ofB?0Ju${E9>LclI-YJJ3Gktb2wI(r+SE8kC}_owM{X##Q&vsh!bOmrPX5+N z)SQ;c3+OO)$yCj!(a+V`%XYx;@``=oF~mrX2&~b_b?KhUgej^JZe%1Ioh+G0j{!(G zn8rUf(zN-6khbvbNj>=39SViNtwHFVxye#>!;A%7kkk|Pw-A;y;MRXFu~lsnGQ|b1 zsVrm#Vu!!yMf6XWAU=Bn_D^me5`<|Dfa_PA&G3w`>Tjg`6hNRXatZ^I`noUz4#LK| zBMT4ssdzYmQQlOv!qP8JLAQv&TGn#yF1Nb=-#^vN!&;Xv* zY_0=fEhlpF0Y3Vq+<6BN?_5vt{N>g2>#K{i_4@L1dv!VP*2EJ+B~%@Vh=7EIL`Z~C zkVsp?BjH5y=DE--BpM2pLP!Xu2+}Yd46EVz_N_-x9+g!A8wy1X15p4OCSIRkzJBrY z^wsP2>Fe?0)%MM^s~2BxUwu7YyoBuq@|I-O4O(?ALb@O-OTeNJ(iY8kn@IwtoSU@X zY5C*lA}Ce3%H?K#`Fj2G^EY2Uy8ZZ*yB~ad^x(<%@VFLQm4k!Z2fW*EuP>+FTDTA$ zFp=0iAwmH?pTtN;nkL0wXgm!r07H^EO%-powg7JX)G8N%syHdEhIb`Nt}UT>@^S)i z7?uV#c}%oB006mV)U0HmLjV9qX&HQKcs%%ET&qDUq9S4dA5?G^0*=F0S6cmNpwlLp-p+IdQ|`@-J&-tE3s>6Asg?BxoG@j?2$C{iU7vi*wb}E z07*O0k*X(5ge`Qfl@jo0o%oae6+mc>zT)W(YsMl0D25LVAWkd=1rzL-dt+H$TQ-lR zKnHfivN%6^=7bp!t9VEDtUlJpA)(lV7qbAhKuW&|uh!{Oo|Ddyo|o+;hSN;Oypz)+2Cdn zjxMYVSP2nj*7qgj1`)AsN zfr>)(=2$AxX?-ZrJlZ_n5sdD+R1`>_34}4#VLjJ%CE(Le}gI5_y|ILkskSCPN8G!VBYI{Q|0FK1m=*i|g3Yu072O=+?{lcq6V~Po?>@Ie%uU?*h zd-3#Fcb_2~Wa;9w|+$49qLR>SV{e7D(5(*|$=8iWvt0EMD?C%`1K9jhV^ zCu8jPts5p_SVEUDj#jaG3J?MOJhB`iv=efiNwHl;Ieo}&k@<~9L=dZ)HEpOC^JzNU zt!!hkZQxQ=a+d`^sj3$d0@Q^uTTyD$DV7<^-I464!&ioRBNg zY%&rxjtMU`QE-Aqgwk0w?Fv4g&})*f|twUTRrPpQ3C25XsTH624aHK<0 zzXD-9Sxeva+eO2}<;xSETD<081=hi+K?#OzIZWT|ndof8 z_S=ETQi9UVpon@;GB7g>yRNH(g#n4nFbq}3DqMw23Aa`;5eNW@P!R?pD21SipcK;j zL@n?4V^F|c5Y{aw%-Lq^KO?PzSyR>v-+Hfn@P}8o9*r;zWq5UV_3iVE)7NKbFJ9~} zPV0D0TnV9ypVfovh8l;)N|~Tc5PkYch*TvY4Mc^Jpiq%=aCChCz4zb!;Jsm>u~xg5 z2m>?Aw5z9Y-n@AF?VD%cY~MWJy?J)=;)|>2pYz!>s#nNcF$%;|d6q7MJ*zwJVqF1H zByzyrkn7L6lb*R;CV1YdXaEE(AjI48{OQZf7pLERcK7}7-T&l=M-M)fdU!AltK0Wi zhwIJN)n>aB9-$QBB3Oiq!A)d9+3ZGL4flskGe^Vta;bNrdj-9PbI678C3ymMh`?rN1GxIz%jg5`~Pm1WB z;ErcCm0`2(zIIzp$Gq4Y+PWv|ZZu{IR2H@|e72GqF?jrWZf@Uh5tH4T@m2d3-7I)CsWwNY0^X&6 zP{qV-VIc8?f$Jztr8{6#D+w*B0ZByLFBSnT0LUZ^GMJcR7Or5GJ(I;(ltBayV(DE3 zfB~n~z4G|e>*I&#QyEsnIP&TF`t1Dj{LQP~#cLQhE1A^YB|l2SZJO$6LX6}H>$0Pi zhX67F35!rg5rKo_JCEQ0@V$@TJvdtFnKR_AbELx6diUa+=dZs0`uf$&?dh|tXTQ4q z=GVKkZ+Y{k)Gc#u=T+=uQ0GgYk`~PxBM_2Jh$CbO?Yi{CdfAO`t@(~fL?|dDUp#xg zKD~PN)x%Hz@ZLwiUr+AuR^{aI))5VW=bO#CPF1h~6_5f*g^BnGL2lW%TN_Ag(dlVG=z$>{j}OWZ#L(EI01+Vp z79_NOHl9U;OwK{}NS z-+R^tYOXqG1b`U998H{ZZmEw!JY?DUBukZb#?sLrw2?HB*rJ~n_-n=~>}UYBpkgdt z%HQy>w_7;lh)v0cSK1~azEoHhRia*OQttUk(03zvDay1OPmfr-e_t zFwUSGTVp}Y2Cx`KP{{mtOYoRbil5aCEK&y0fCmE!3B@MU01TmesK_K3>C_6P^qY1j zw0pOm z2rw#Q&?pPC0G8p-gGcXt_|bzW4-QXOAl1zPF!OG#r?1by{^ILb-#*>Ec{aX&dimAg zT|NH{Hs{FeQg;m!*_^jb=q1+jeYHTl0#vA_`3GA8T{d}>%h?6f=80{`tk@WVq}1K+ z)zfDer{~YUdiT?x+AlE|3A?OGd||b$D$y9J;CJjC<%SOJ2jt4g^VYrI-(=k#cJy2|k1&h3f$p4Y>iPr4 zOcE9?zz1p-XojVTC=7-;!U;Wzkqj%=$^qS(Hhbp40-F|U(YN-X=&VwM$0DAcBHpK7 z!HdTjdj6w#Jwsa&k$*EZ{>-5apw*2isTD_g?akIfAbn3km@TCxSI4K)^DFJrW_$wW zB+aSM-vw!n(`>bz;mAgRDM`1)AmMz#*7`wGCrZ+o~F`Nt*ux$ z1OP~F`<3oX!KO?NW+kl^oqp{`(lxy2_e+75aA8|wwJV-HtZdBYCT;mzMhV-vprfoD zLv;U4Kk@0gK@Hx7#+EQ{MsDqe0!trbPw47~`h(?-_I_jn`qoP=>684cJpKr21r28O zFth@iG-VDPJPj)+=*8;KDL{)4z`jdC#%kS?1%{CJ{r2D4qov93W@ZK!19rUibyKZ` zJ@SmxnlWU4iNITc2|UGvK&RW@PTHj?0CrZ}wxZufbCYh8EP+8aI}3yL15|}gh=mb& zsw5%<$ixK%3IJ9{6o7$PNcfORU`$x|kzf<$_jjc!kCV<_mE?kE~zF~UJ0(4PXY z;jrF*c#emcqwE+C4$JYus&2RIiz^H zeD9sdk3RhH`2OwHaTx}6`vnnL_-eg-{_XRppMQDr?A!6p^RuTvzy9VIaPf?Gm%@{l zjP*ehSE67_(#(S$RI^x4(>^F5<1}GXH`12e38Z~;AdQFs_paM_nb~$3NFk8j<@M8_ zJw1PR@AdCL_|A{u{*!5-!;`yrXt+Lqy{#h%3l2=B00GN1RgEG?j#tw2fYw{6@dk+p zFn%H_ti*A7<56h6{L|5t!syI}G*1fwg#ZJb0tyIuyZ_d>yo*2Cej@~_B9@T{gjg(I zOhh1>=r0xtrEr6szLH)^`r4|`F|jh@7G)H66Ud?3(r~Z?%&sF^_{s_B&XY^u*UzGY zCJRHGXI-$+uoC)VW@{Z1`@t7M#^?;^h8rC^O)=T1KGp3O^TTOGCZedWkT(J_4#@@((-;pSKKnLBcG4-kZuF1@%)B1FW! zsl{OS+&#R=DBNqRz+A8R+D$XrmKEpg9+R2fd*1~;S(>_fF8P9+o??bX8wB*+hB?Id zD1Sy^J#8_kC*#Rdw&9*3bvQ5O5&(dQXZNgHGPD`YC3F=UF}}doE!H5QXY$!F2?hWb zV7A&rfz|^^02x6L2c7_mfOZv!X+W$9P|Y&=VFOf3DSjS^wBzLr)-b0Ez zh*6k<%djhl7b9FxwE`lQaW}nrd0xj+ctT(iW@Iw{U$mFCBY7(lQVq=RvWtld5g`x_ zhqoWT|K6kbpWx8}uJCY01@*)Zs1+_Q)?fVQ>!)9QasBGs&GRqLKmXbG*{@1HN8ZRZ z>K0&Vv%OS($uejCJC`$XKC#=n0AQz)2!wAPwra*#CFIf)3{j(^Vpc#ZA{Kz%&zQ#Wb3%JMm7md@ zm{{1p2!H~?`zCfqOZmt_e_~C%R|D8NGSu{b&|q;jaCabBF)xS-Bbo{&tPoPCI82EN zWt_R<>{TKO2oU_ZN{Q%j+sg(~TQ00L-2f6zboH{z|IJf&d|A+^6B>(W?OGdy-lMCf z?g}f&uB?>SRdJv&Io;;!xp_*^d@tyk3Gj@d>Lff|<$Y;h3GK;E*LRRQFGAdZ>t_1* zz`hi>6%WcTGRo6$XA_Jm6@B@EZ;{mAY&I3%+%-RP=OM%x2z@`Md=h5+em`8J`U8*| zHrq3P`~J-s@kViSkLo5=vIiJX{CPux1FzU4a3sI&HmUfeT4W+LR=_sxjed2#4J zYPxymet7Dra#Q5y(weFpa+Qi`oIMo+C_n|JB4V9{a1ao|6$2Ai@!q}wj7R`PM4l#V zE>sXU#$Fm}W^<&cT(BY>I@r|VdI#HyvCw8aU2oPGo9)zcwOsQdaGkE-yx?(n|M3TO za8j#K3+xCY36N;TAQqwmNW<~1cRu{&{`>FJszAZRRXHd)poq{k$(uJ9pZ)6BUw{6^ z=JmImZ$CTz&0ove(=uMN?2v2l4;d|o(B?pldfkCDLOVnHZ}z=9jY;Io03n?KNneJ! zf@aPjzZqV4vjTufz`Ls#pN-q|$JgigKKa8n+&LJIPVPRsmREJRMXuVge>Xv`1Oow7 zbi0vn>fBmvLIVd0K?3=SOlD1!(razIeVl=)P62~qb`i@_20P=q1&G|L`M3<{ z1${tfVHuE6&komiql87nf>GP1OPA7+z`S{Xy4dK6t9MT-g~oagvIT|!8mlaxjD}%R zn|^Vxp!IZ}S+#{OW8-dfN~g=BDNW-KMS@Dwr(?^?CIn#do*FT^izJn>=Q{H)>(Ngs zHCA%b2#uEc{uKMh_7s8f1fA@4r$W4d)4*WhPLwVIg%Gzt(E$$=%IO=kw;O?NbN5%U$xGa3zVQ|i+ZQQQC%KBUH9 z7`%g}uiuH#+`7#0Q-DZ!sJdTeTtnhM^x}m#pswtE`n}NCcn?#RUDl49+_N{p2|vF+ z?Ac0oHJ-aPH%b$5eRS?hO5`lzW&eu zUWAYT@jrj?;PK_vS}FtT*}{-oHx$4kR8~i~9)0l9-S?mHY7ms;gVo_M3@8XVF+6|% z`m^FD?Cd&;jV-}F)4YsOwHis3G$*!k1c6dupoK+2K^dEPXa$JW@ir|%+(zl_sq z1dl&o){NOv?#Mrz&OHK@6h}yoI;oTd!{CA)+qujJ^TcQOgDiUO-Jv0T>ZU|GNMsPU zNh4@wJ$wFpJATrYA6SzOV??C4U#em(|I9V2NB0v?@0tUHIut>o;AudFJWtLg-#t!8 zEu}$B<2VhKcteB`y_je55H`7W5eJmvLW|kaD4|RdSZ~B-qLx~0#O8vYI|BrQ)_FgS zj82EEZU}|1I6Ey-SG5iPtF(!-{^((J68re42j)6-H4Ccxq1SH<$t|tmjHWVSX};K= zp|Yy*G`PONIF=v6RQr7)&_?Rj z)bS?{nf6SA6I5VyMpsqJ!nsj&A6SGNv`$;=h6&@FZ6kF0CeLI;jgArb2JZIXnqu&w zA=(sm$?^_`+iWa~4HZmBu(JE8O{`g}9F^WTvi9_f&jx?rmRDN75D7~m77?i=fKn^# z0hovtNva6e0gzafRIjxif-7RB+K3uHqAF~yuMybtn?ag#B|)~tnmX}ryP38drU7}J zczv}67>3or1mwv-s_C}Z=k?+xlmh}dI6j7}4WkeiMkuY>6#^m@D#s^}KKSs_2k%eA zFo_%ubTGhB1OPX?`t7q-@yng!i_W73=U;Nkgv%ka58<{r36+_>JGZ`U<#8ozO z7|r;&FK%t7v-{}vcl{pLx$tBfhE!?<=t+(cdQRm!?J@IyC^^2d^meY9ZmR9&%U}JM z?e*omKm60CrHSqi|KXr_&jQm0xqdoFArkIeYQPrR^JM}?C}lWkor$LkAV%; z)~f_-twH#XpNK?AxI~<>#3s5n6Jbj@CM;nqKP^{}k4~!DOgIY$B5l2$ zoUJpX5xuo$)V<4BBZfsXf-|oHMaYBCiZSh)-E|PX0aVu6HuLc`Va?r4n#-ks7@gt= z5ypNB_OZ=-c%B~5a@MVdRBTul(F+GKkWU&of>cnkvR3<$_F(r~#=o-oN|I??advO$ zxAGu;M$SC!)mG5zR|2aghFV7o?B5tCx zX&3hiVryq~*nqltK6|5(6RuUL?f#~*z7@Pqex7#N`xS`9c56~b|>PrrWt^Pm0f%{NcS=U<%u z>aTV$f3+Gf>bMqQ3TTDST;HfPI&0U?)yl+DFfyGxnD|IUzhjo~x%Ev^8wm^!(!@5l zn+LY6(>_=_2og+}-~8RQy?Xce|G~+VPvzkF*8O*{;oE6_G1k?tG7>RGF?}4<-NKam zObjiLxKZfhtb9A~Af6F3JK=5k0>SDGv%1*rS;F9xCqWs}!bamt7+aJE0U<~nBq~UR zMN@6U(9YCo8;cTQrue+qmzJsKSV?mBbgf&c$lf3&kz6VGx5Lc|Dr+W8jn7E$crwjR zuCqQ5&rD9p3WzwpVL?~`L24|OTL*)r;@v4l$bf~{cBT<@}2@hvR;6 zlh=}X_BxBwtPTXEQA}ucDjh0q9Ac@2I_65r)6bE5; z*&Htm4d9+Xc9NQQd)DglY5TyZ%pNWCta#Ipgq)j`=zw91Id{z$d{W20bmq{vXr=+? zV5k?_z47in1W)fm?vaJXc-qKAg^I6jUc%11YgfShHJ9T(;+OaGVo0%n!-@yjpX0VJ ze!ae5P(ky#nt{2+G|pzGEsDVW=Wl&wdT;Lo-taSM3Bi8T*-yks62uw&O6*sAYH#n3 z-U=({KXpNpl>FXQMAkOGd=cK2l=LRy1?3qCAKJV?>>sof07)~C00R=BHv4ph>ncv% zm_n^kpy;`7%oUgb5$dEKd__cLVd7dzpbCh!oJK@p6hfqQ(jKIxw&`K9$}0f?AQ^}0 zy5J6ARn@gbDy!A%=x7`cxQ-TKViA$m@!j`-?@v~%6|atVS637TJ`s|l~F~0izK(3{Z($0BCMhSrG z`n*l5Y60DxGqn;LyfZ>eRT6}OQ3A6ldUSd;c9ddyC~Eq(04it$zbINpaKu5H8x3{) z=IdvFGd|vKZ-4aryQAZy`|oZ&9b(xhx&@ojJY^PWlV*y#GcnSsLQZ;7w z%PJBjsx2WbeDmR3zKwo_trD%dlm@GUcxuy&pob%mJ`|h;(*G!-FXruE-+YI$lyaX(K!#g_( zp6=6R5X~IBx7!0aQ*YT)K{E-yKCbuLUTA)YUDGrBC3z?D7>nueM<+2uh<5nBANOq+V|2V#CCF*IMTn& zZYL_Y-)rfgXcd}as(LZWi`p>?{+)fP-%W@-Y`VM@_*J^O>eb+Wo1G}7y(668rAc%T zSg;dI7rt0y*>m4?sXYXYh=350v?zKSXEN$Ru4wwW^N)Ly*|UCVH-ZEsQXdXLt-)^2 zQY9BaQ|#JhvXlP(xGj@{`AIYNJ{t^14*P6ETn5?$I=^iGdyX&8 z5YIA#>{sySf0%#TO?zCef55=*v#_TBBs@hN%sasa{YD7i`m=MXT#<&WS zRA#IQfG{|?(Szj}NSnM6vmiQ;f_`})ll2#Jb40=iygQ%~fLWkmL4>ke4F?Bwa5Rk@ ztWyyL5atOGk8j-pr0sS@PfbMYC20X6Iyiao-un+f{AfBD7(@sMECb7RKz*Htt_aa1_3+Bk=dTyrXe~KgsSzX^Pc^q_#rlB zXKNRNp=7n^`?xvCVNr}ND*%3KxL?E3z4L}~XppAu&vj4JVV?NaK4xolF5+okz3aIr z2fuk2K8g8e6#SgcjNiMl{RV|?CwgMFq5izxFe(dDTn3Ugf*6GDCIYO{8dMj;m1Yb& z`Gs~hHK&CAOobnk@_7SogGc$it+b7sdjhrN7@#r4*qfqm#XEt?yQ>X3O-0a>X0h{? zm)a@b;S{fVOQK9;6MN8;wF|I}-ZJ1YZ)d%lj^# zR~7~#@hdU-zUM-?1<}wLFv(JC>C{Tw8dKG+5XOM}Vf?PNQ<|t2c$htM@{uGmQxcS% z-(52eEFm(kFrT;l_bf!1C9vVD)WgDkzvh>Qz#!s&%2Obx#%DUJ184pOU4+pE2lHh0 zVJMJbzum_J8B`Xq1$_iX{3Js^ssdR6*%~b%F-v735@BrtkIbma9n9$Epg=%^*7Hh$ zNVH17TJ^7qwM71b(?iJPiZ{nJt)%XVw9CM-8V-(*hr^?3JpfmM2>_4?frLRosE`>( z4G$s-pa7L&b^q~`M<0JI$A@hF37L=vB9Z#?`K!-<{)@A3zTSNE+1W4uLf(8y(?zYj zX7HOw8j{lqN&ua-Z@Rq-XNL#=wa`R?nVX5XeAyTbXjA{`x4(PYzu` zA-pPg2H5&dE4tC&5Vevndsx>)K?t%%e>JNWB{qOWk56a`=d6{XHd%tv9b2r*LR6MD zoCd}5h#&UcKq@94%+vW%yy>+OSJ)|Rx60%mrx)pi$1C09I8n#J5 z53Ldwg5wNXxAqi*4X6P`1%ybbWo(a;w4Uk;CvVy&1FbB~YoxV-o^IvjXv??AzIVq0 z2%1)0XdSltf%WQcZg`S-vkOQtvNr{r#J$YD-?=G1l>qnRGXxLx=NaA4 zqhv##k`XZjzATpcxB2er;*BV4xFl_h_5%$4fXzfETB`#Y4b1NYd2e|I%uU#$;lDV^ zID7{GQG@FH0=sz_4FfH6u(H5+fo9jEO=Y%JCztwpc8yJrC&@(=XtrL4mVzA5R9`=^ z*~r^;rA++13esAkI5+8}+mJYG^Vh}9n>St%?VQLc6G;I<;Ykpr0wZaJureT$H2_2? zShO+$Se+jtf?Amf0HSe&#U;?Yi3AKGr~_Xgz-GYP6Rau=6{13`gTvLq$*vr7-MO|S z0J1KUmI8nPghWUMkdVsl2ag_o@-f{y8bOcN@g7l?&rZ+2_~mD(Uw^*-=Cjwo{4ad^ z)rzmjx&_BNduBgF*qOw5tAe)KlCoSn_u`TpUOr`EYA%hfB{P?y(BW!W4FtHpx_a== zJ1i^!-}&^@r{8`f06+SpKl=8?%fo}iU;g~(yY2Q*{@&mF>EHbH&FdGd;UM#!m>`%LQ|v<(zlybr@{I)-5I z#%!%nr4d*OTE<&G0l^UKY;a02kH?Rqm8`ZJZ0)5>oc~raXc!kDIYrtt} zZ9X;ec5(d+dKx)J3N`iFhPWz>mA8-Zrt+Z#3avHpANXV zjoL#~-IUPNIW?Un-WMq7(B2X=`TTXig9KS-UT*fETiRZx#cs|+3S-~DOL1sP3nMng zfpe4Z%GA>s_612(Bx^n%+&{4P%cZwJ`z;3bfos(GIIuJmO z!77*I#`0+3PQV zy?yrC>tFuG^!kexU)5>jghod^rWFxPuPh%nloo^XA~R_70j?bg5fQjrCAr5yvid_ujkj zyz}1sPrv>4&i(u6mlyXR-hch_nP z4zju*h{_~jAS5qWYdV9GG{1eIGL+Ro!$8AO5M;gHe*X2#zy8J3muG7`ztY1xjeKaD z)@Yv0dg~S>WG#&yt5l9D2nAyXH_>+KqQQVtLlJXVI8=X13`gn2Gx#Mp;u!BmG%ctt zjE@snBEn>jN(|fxs>WkA+iG`--WYy==N@{^i0S)E;$zx7d64P*=@}fCg?kVM13E7h z4a#j9Tc4Xgc4>-6X#y8&@>C5?} zn;4p#P>6k>Zu~O7^`Z81a@}ma6K(V=S`r1;x5{jY`v)2=1Z84GgvHPgi&$Pf1278< zGjL^Q){nVX{b$vb78a>`1&|8DAgl*3i;xJ~B@KnMfDn&IygtIJCps&&HXIxr938C= zkDv^KMf1GD(k?01LeD}3pu^+a?|k_2$-@WL9et~C72IC0pMLq}>#x4pJpc05XMZ)l z`h2LD)3_E73y2*b^p-S0T+3JR{Bk|*e)-E^eD{0b zhr?kFbwr?{RF-=W?mzwN>-F{Z)%kg$;ogG>&tASbxqt7|-}~YFAAh7viqK^!ibro0 z3=z_FefsLxe|_=IFE=Cqr_V3{-Opc7!)>9KcV9Jz>}V2#fV2y`ePtz@1&{&QI!;(+ z2O$;%X96Uik7VqW5Hf(uj2%hD!UD*ts4!yQ0G8@pjegJ)E^Z1-+lp#aG-Ekihc?1K z_y^5GM-U;ATmH~3z`}O+E;wBec8&^y?!7R~zLR^Wyh%}5SbxBz2*Pns3dM1}{+}e& z;bXMk7QV(P(dNo%-i{L@12KUIvSE!@0}=1*CM{!;P=am;eH#2bWYH?|f>&b;#Ztu7 zNuk(4uowm)FnV{5V6UW=??FN&O;I~Hl*Zfx3UO$YB%ys75qf11m&&+M+d2>!E5fEM zz}#CCniM9F;du>|&5-U74Y5#syvi)2jSZR-8tvir4w zQ?Uz6aE_~Qsp<_ocH$wsbPaXXT#W(&Abgt-v07%Lx?lEz}(KaCQU1oeVt(}`p~ zxKKnUI=-a4*LcY2nJ!qk^0?WKn+fALhO!j-~QzL z-@kqL?&+Je!{g&0{mGxac=-|l{`4RH*|#sAef-_;yz~ACxH|aG_dcBfe(%RWdjEUh zJ-K)94}SdP%gd`j`tgr9)A-Y${p|Pu;16HDeEH(}vkyQ1_~~zc^M}9x2lpR6ymR;N z;p*V^>(?T3xLV!1ee0cv55D;9v&)OKAN=0$onKtuzJ2@aFTZ?n@BaDOX&ooc`uE^j zK!#W%A(FaX*WKpey>HCVKn{{_uh_v#Mw-ZMZ@k|l4XWOUdW)8aTHw|LyE$m4XLq7Lrn@%y9 z;_4`Rf*=dkFMj>m=Gm98fBj!CpZ;_;UC6XS zg=_9|K%X|qEU^a7*8xDl%C**daBw)RR!1i%-~GY&&#$gFo9*%8(c$6YZnrx+KK|4H z_Mg7{(Z{E6P7e=OPd!fyPF|MfrKIXZgv?Acdeez99`j>_=z`SY(o|NP?3>C0!&0fdrBMVzGle=EL_ zf-r8crp<13>)u#SuCA^>eec1o6@!dw6Hub(n_ojnnI~;u+L}To`s&y226C~NIs+KBm_BCqb$gY@?Loqq+X`P8it@VJU^&PW7 zx~4ehZR)2H^2w0*oXu>I0wO)=nLT5J-+=<#D8g`pwvZq@d>fHjH>4;sj{~ZEHV~7P z!~?XuyU*WdX+H!+_ZOhehYEO5PAP}{?S{t}FDc#jXAG%@Fd!{V;|=_d_QR;r^?Q5d zw>>~)lh~CoX;^>oOpJlOGsjWbwrThMY};@P-QNqWLMtWI%Mvi4_Lo(Tn*^AJv9fsEa1qu{?}Wm7$PQuAhH`jxxH&kin*pRo)f1z`Tp|HFx_$S_ zC!d_$yK^l&eP+^F5Kq@<=P$ne>gvTem*4#I`s<$^?#^La3r|kS2yo=snn;ylC@ZSd zC?d5o6)L41tPXbL$Se;ZKbeFNPmX{5lb<|${_NvVK6&S(kG_5S&FPC5-}~gd|LH&c z``h>Kz4PRq|LOnnKb<{){+;i9a{BV+x8HpG-~8F1eeva&r`K1v?>{)ZUVnUi{Ij3^ z?Wf=U?gyWIGO>)C-Ro~(eDvhK!hCgpe&^)mWOeZQFMsv%haWw8^5k#+;=f#9T)cku z^5V_uumA3s<2e52r++(6<1|fw_2M}Q466Y}e)WrA5P4V3s5=YFIi-fQk~eMhEkIDO zUVVA+<*i}0`la0Y|Ni{N|LN~NKIDmI0t?7kvsf_tm-FF(;$>x=^p|U~s38rKBFM1d z86%HdN9X-xq6d&Q#$=~8bT^{cJz1A>-G+9g30dufpFysN-1(u@p$i&~EZu0Ey>dNj zJP3JRe*qN2(lwp@ZO-59n>jc#vtD9M3Su_)iIdOut?depgh?Z5iE8bjnB;KB6&!o{ zAUeI)ANp%fTa0O;+4oq`6Od94a)je8juQ6 z^_j&M8%=TFeAPJs%HrWY7F*3!e#}lv7cr^4?lZz~iM?i*nu$&KX+E6zx9lquni(z# zqyBa&O|BHcJ{~Sb$68^(F%eCwL!vwmZ7Fl&kLg26fu}vAT|`u~d@MT?WbSaeaIqXS z3^bR4WzN}>+Uv8X@&n_dwUvuw2x+%c`I>p&upPE=<6_0HBJj6=RK3pegLiD}IL{&= zDJkA^i^92ry!jhP36k^;0Ki}-mIxZwX+RG69dm&}4Ji0nwqym+gw zw~}gY24uNB(P_qIF0w1U=#)uz2fQB2Bzk7EAR&}eR)+_xgTt|`geN_ri-D}66Oss) zgQIue|KQH!hdW^LW|%}m!n^hE?AvEo&%U~T{_E2(|7O^}hH1@pikjqDn`}srZr%F$ zJKy=@^Usftk8j_-dwPEU-FaF`1tVFtv9DgwAszx>`0fAI44tKa*{PekhL=g-E= z%iD*CpZ(q6iST=m-+g_4{>v9HWSYj!`hWdj{y#6CKPQ2|{)_)Sjnn!0S)p=#aD)K6 z^%@bk;|PSqPyh8whOKS7>x9AP9G?6m}6VD+ud6dgo*9t`Rz6-!d*g;@Z_m{uY>(oTR`| zy(RDs4s(MPeLRA9lcYMe-<4t0s4bS1ha`qYymq*0UgOzk6ryW1Cz+EXn?2GDV`N|05|Igq)YN1aPX_rMr>35oG(>v7%dg@RKu=YY;o8HFU^>6o7q?l#ujN zdiNOM#e}4<%?7joI{SX;*4mF$;+$5z_+fwb#6Zsw>%#8NuhW9nX4v!C@=xYulDBRF zJ@X#9ecE!T#BFVZK1;$TKar}t2BfhYNj|19qx_oy(_46;*$?wGX2iC45&(diGp9aV zj^+xQ;YGJ5eS_#|(CR2H+7G`SSnutovGfGeN@44D(Hf+6(0Fl+cHwC13E;6{*GuJ} z|Jje39p138^+v|oQ5y(atfjFy@Qqm^ zeg5*xUtd4}_33ASDW{*)c*)b&-C&ChCIJu-xcA`xlTSW*@Z`w^^1a{xy?gJz`{>Dg zk3an2)#>^1?K^iLJgP|VJb9M^HkKzP`Tq@X-(d z;13=?eq3w)=%bHLU%fdyee>amADq5?b$NPveSY?fzxf-g_2oC;eEpl>oIQW>^ouVp z-n_XwKL_E-D(Xt%e~82c2jl0&1d<*v=GHjSvSJ=g67ca>SX=@hwy9 zb{fak$(?Dqz1!AL-@A8fRfVS}!U21lmC_4mNRj(Y1z~09kLgpMUl8uYUg3>x->+@A7HmJyVi*m$d(& z&MSh5>}suz6r1Oc?0p5vMB)MXg*rk2vBUzMhAs-wP*i8v)8uD`matmZ6q&*DBd~jR zCsAhD_yD_pz?A61(#0AwW7=^B?)}Z57olawhh;OaDuu})Zv+s})0bKQeCMuuOAv=t z#_@!01UeyoMvKpe_-S@sLD~{j#rVbNJzXB!V<&(O3Dt>nvrPyBWkv*P4;ut&&Iq*6 zc(ON+u5N5(5U(X2)rsX2PxR<{X><`0gtE41$e_R1@}@zB;&v&kgk{XpB_pgxKA#;-IpIKn zg2YgrGbb$!boNp$Xw^nq0zyzkqle_Yns|VZMM#53#H{Cv2s2Xw00IFiVB$n2gTwZ?k{`r(mkH_xc@lP6D}fAh`7`Pt9@ z@-H7hc{0}N_4DU%o9nIeQ*K5Df!v-VNqp?N!ze+T0Qea=YVg3~+2)CRjyFnM9B^LL7$k@c zqBJW;(E|chdq->LEXPK_K!N#1Pa?OYIa_#=TUa%z29;2Wu}N%t6sycP#7G(~m$~wt zIp2OiBbhm;CpD%>+5nnvie+y{BPh5`L>G&<^HOH3)u08r=$$i@%NQ77c5t}yQy_p8 z>k`LhH@cx~)76x9)>524^JAAJRdtH^RHe{lnz$_S5?^bNr7w#3OVXn{f#G;!YFyzgr66%?lh0$@mu_ZuTXL12j!ri{<* zO@Q4GJ)}De5a!#>T>NYfmu7E<(r!Xm{glVlVK!Y^nB!i1!BZ0=R5wauW|Hs&^v{x{ zWHvXyTNYgwUbz9CNdI?h3)=O}%vaN{l=jH!%$8`d6qvFFvwZLGr$}#j&E{k;S(qnz z$^R{1-m?35y+Riv+(#^Bz}kJptr2eg@ipXxWIeqr+)$?z*&%and{l&p}!Q&1=4=sYi$g@roNJ@};Ete4P!Ato`XVAifC*9dqTDj0TC+i` z53;K}oX5yZ2|GPrz5e>}_QP^;_`iMj`uk7reE05>woN!8V~`BMlT>zl>oK` z8AL>@r$7rQYOgFoD56GInm8k(Kyi~M&XGW{xdMR3z=MG>7IZ}1RB1^GKAhU5X2}*U!O$=?AkqE#CE*t@$ zF#?_LHUtybZY1Ghy6K|i>>>bKi&Y@(!DUn8p`>jIG9M6Kqrxw-))FmjteFr>LAYA? zCan#cp{I4E@R;k@*n`g5>zX;9Cv4N#zwCQ}!Azx3e1QN=Xy?WtT!s9O@3k;d&;Z$6 z?Dt+%2T3XQs4GB`S5)-iY!>>ti5Xh#CjHpY(CWvwcX+eya$^KPeKa3K`lxL#aL%bG zVgoGU-+4@NPUukYED`CJ@k1^Cxf_lK(NeJCqDM|wo zA>IwLL#^OO0F^*$zwO)&gjiOqa&S~u2Ru#!ld6+Rn{^r|fUw*Bm%;tK1>*VC} z^mKi4vOO#R-ez7z&mm+pkdl*QB$*`kjP;N-!l z>V%_{5&LJ;_)V|?+D!$+Luw-zprn@*?7*2Lh{k4Ns2~s#u&(h5>IHLS&I6I1uZ1&9 zZz2MTR|`1~&prT*fFJJ_u51GAJ*5$aiH2|uzC$QIYxOREhqlXdJS&z}61nQ%i~HnP zAPigCcv3gqgvjhzE-Ys^{oadi0XCXoOYkRI>LfhunHXh~rFolez#SUM&}y$iotfJd zQA#~p{0lQf8=uZ7isg5j=$gAepK7oQ84U+_dnR%J{q3@oA$z{xZ;j?4*)~~FGBfg~ zc>?>eV!m>GD@em=lTJ20vRmaMh%}!NHpsx%8Suh|(v30F|YUfX#Dl z!lbJspnW4*fP@qcK_LLB%z#+pKte(k)NrANo?68jfL~6nJ9_J##C!;dpvY<DSd}pSOj*h>?9gN6Gh&*OL>BLeNS-61a+4xIk8T}Ly_t#=-?K#^1v`*G(!>9cP zAj-J{5J2s5u;jG>*TTB{77lvW+U;!JY(HZKiJ&t)Svf-U(d;*pAb@@3URtMfl4P}i z1c?!~=U&{bin9sHreeiJ(9r_C{fdzz_ zk2%|KRjob33^LA!s+vHv>bQUWHcoH6&?X7Ip-+Oc4KQQ6`0T#UaAbtkP5a(nvirJS z>|KrwWdbz^CP`;eE+%V1FYU$9dG9P2Iwn5&yybO#gv~Lvc@Xzd0Yzs6X#0X~CG`O_6L;(z7J6DXMvfUpgi>*_ssVXsRr%f6N zDl!Tde=Zh521L9KRxP+knv8DIrq;E`px`(SnFetqqnw@nn%P==$! zgTv!#xQ3|$GYH*%@bH}voCNlcBC;BW#@TALDb!u^KZIo*r|=#7^|fFQ97l9`4YBhmiOMD>!=H2BW)cMj*i#OC>@uwT#gJl z+Kka0WXyi@JHDAex`~9#p@JDn*}m2XVf|9B{Kd0dAtrT>Py=J-j|^la#n4n?L*#8v zdlo#lqlf&W5%!GG9;mg+Nfy!BCa{eVRYhj$P!)&dG=~6Q z$vil3tCtj?x7Bfo>PQXM1eL+j-w-3bM zbg_&uq&8ReKBT^=;bp1(dmruVPtI&c_vY}S3QKgGFL)tuz%2L>xThrz~) zaqIA3?1FPalI|%w(MnuPUWRj<>1=onfyr!O z;&iG{paa&Z15oIYdGCgxW*3GIP=h61Z z?}H5#z#>U)FaiP%!yz3W;p&i)5a|AcM-QJoRvLyx3P3?z5%E;tyn1o=;@SGu)Ag$_ zXuRZc*9in#3j<3<161o3_1-hrD#2|qH`|PH?<*{n&K$h&`&zz!{#wv1u_{@&woIR{ zdf#z;;>}e4dOq9YzilvLM^Azm_W=P2Bh>5j=NGS@zPPyl-#&YBHVr@p#DO({!4N?a z6h={5(UZQwV71alro;3-afQqQ()m#J5`zd ztjQ!$aRC=L>GHub$z-UA5T$FB+4zs91!@&{{2Gn>0k!vN-8fua8r` zF^G~zbao{>%bqFfv}12()N$CyUd;9;rfz`&`{KXRn_XaGeS=*Juf>6@?JWPU9v&IN zJ`CfE%V&z2G-!Zcs3=~E35`1JWf{bpo0w3wyxo~N25bP9Ahd4cMdp}t@!HF3>{*e; zm(e+PNyD6J;H55YYBMxm&Lzr|NgikJVL`H%a|q(QqgTiXh^!T=;C?y)1gE?lbDKJx zn}bZzr9F?!nd!ct!elc{_B&EyFvFg2U6=XN?~ye~iQa~0x&cH{WCm4THIIKWDBSd^ zS!7DsMr=*dPk`&34{-G6khfi`kN@UJ$Wxc%@4nD%HJ+|)q1VTKb+|T;QPVu26oO&_ zA`Z7tX(-exdJ$wsZYyeP!D5^&Qbib`nqMox!pswMWjhtxPKjo-Zd|2SnV2W8ELDVS zt>cJ?2ai8p4=0m}FuJp6C&glca&Ryl903li!&~ou@WH{Y69Fb;o^U9*LflBueluRQ?rSQF_~hq3}9n6722SP*b3`c*a!`fMAjq*!ncY|EDCuSFVXxR0j@GB z*F(nhakk1SPKy_9YdSb>O z%}+8_cSV3$kQoJv6;|X?hy`mKB@rcZfT-)_X^rA!q#I7%zbJadGC0o-vDlf^gZB1( zIcEPv+iZq}^bhh$uyaox787_fyq`jCtcISF&P>h``Y_t+=(bCp3LDLg&JVBe0q}Vx)SwA#EXU0waL~9Jh&^;@Gn$Xz1weMr4DD#k>J)ilmkv{owO1%Y>Fhb1Z4vU};S< zrL>r`J##qwdp~YVI&MZ&EibkI*8Zi|Q`#jtNAxm!v(pKC57Q^Oji4ewizS~09sZ$S0R!Lf+$R$;35K8 zg@Bo;dVZ0$UMd6tSSzZ=C7_T*1B03j1w2kL+<#o|y}Mx;nImZyS*VCcqe{WmYFHf} zmf_&e-MjZ6J%oY?Qb=p#aD~Xzbn)ud)vM>*({FaC-weDN>sD_Yhk5`+QCbsz=Qs8= z=WumktDll(_6X%oFZ0?R2Fx&T{#xueGUrCEim-s?ZKV;2DC57F=;f(oFIK zKoF5RU$EIHK`aE@i&s}~o}HiE{@dTY{^7eHpOm%K2?1CP;&|?!AZm8Inx$5lXt-M{ zp+!d+H5hHZvw{a`v6BeEgE+k^NR}$k)?U)I7D1pj#_*zmKoXv6Rr#XkN3V|E|3+s4 zeWsLpqCaM1jS(~)Gc8v@O)`t5hj0sua~0fWdb-t#YKia!QmMmIt^kpkYeERtepSQ1 z;rmGjF+mliyxO2*!k~#wYixuNl1$vW0gHD`=W^Jzj_vVD!RYPetPGeJgmFL7Nf-N$ zj#u01kxRU|j&7nmD}T)U!%ZZ#2}liooHF$MQLjr)`DxVhYK@(;ltZ%-k=HsWqrm%I zC>h3yanbKZP%>a8hUtzz^?BV@JDZQx9C3Z7o*~%d3Pu5*De+j{HaYuyB`nollMwO$ zEM7ATzsF=Cu;*Uce^_4Uf9Ff(&UHq(sfH1He`xvReb6W5YneelXQA4TvrEkpr>m)m zBCk0TMyc94w@(^Xu2opKs1y zZ(e?l+t*Sz%(avP2nr+GY7k}`NUO}2Xg%P+!7uN<5~w!TX}NeI@u9xm3)!=kV*?Ds zP-`3@9G1{5mve7TQqjFI@l!Gsg=>@YBrX_&?+NzJyWXojRA}n7zCL|+eea!LKRy2T z^u13X96+7K2ojr8OH$x4yLxgZl24JOV)jr8hzx{LVV3Hw6g^ooIXeCkcek5P35U{y zGvfS{2#OFp>0&Osr2{2r-LYAlI5oF>Qa!vLOd9YokEaXUx2U8@Yu6N?=A7asphwR` z()S3Qg~S}}oT-@B0I;873*;$8r=*QNjOS{w2|0N5w|VH1@Zfx%KP0B`m+u&M0tvHg z+ge+h2JHO5G(pYg8OC4{M8d@>O90L^#=RpGs^PO~Hw)4!dc$0C$#K--aFrpjH65QK6R2YiF;!(-?{<|It%T z&3dZ)0=*7ga!#G1u)bzN3Gd@;+c)Pq7&ChrvzN#G7UD|3ps6W0F(o&`vXEii^OLl# zI@Ge4+QEQ{J<^gWYo*qMpu0{WJa8W%ft66*?WT@746*DZ1@=zw(n$Fz=bv_FYlgR^ z`^jDizMQ2l%{*C8=y0R;Uk$GhG7AC#{TjBkwyf7?6YFozai=s%Z2-6PlbXP1X4E~I zrfHS@h+w_wS%idA2&F39LBd=Kig5=*1y~~_Kspreb-GyXbqDn zjIU?^L;EKPB5W^DHIXlIZuE}wGIRp|;8FH8bFKY?2%R6Sq=+;iZ>*2S zV68%6PT(}xJBvC%r|^3N)B+abT0aFhRbeSei!>%HPjxhrcp4CAJ%|%=o97V0X~1|M^_Dv+UEz3p-@>@&{oG2P1qi$=uxU7?gwKn4UxViZBrc922^tr@n~{sB`#X6sq3 z{(}e?tQyBbAOJ>~Kv0C42gHI>?PO>jz1i9d#KMMI1zDqz07A~*O-#oRKi;kGZdfL% zw{9Pw+&vJaT4e&5MCw@A*PGq0QlW$6!{Z0HZ#_5x(^i5 z_7r%hZVfm04bfu}864vZT^5I|w6AZP|&FKHJfKoHP=S%55z1cCyr+)Rrrm>=F8nb0x5frBX4 z)u^_t3~7%GfK=fkcDj=YbFEssrYq%C1t3TlBqCH+qaaG^q+-US*=A>S`mG;pjj-el z<{Cf5FQ+LqGvBjTy*dL(1sS$({#fh>6SrSEXb|t%*Klzn%o?ebbfJI)v-pm~>V^;8 zx?|+V8ONU?plu>f6|CmUCX^Chr{t~V&>`3zJ&(wDGKKhbdqk`Z1O1U1grd(`v=d92 zvJ83qc_v!Y7|_Uso_dRUb|~BCG2F05_u4ID765fG>0Z!i`wW_k4-c`M*laeyh`a{Q zJK21@k&Up-Qbd;$c+)$xQO*9yRIBbPykS_4#7YdrO}DTmn3?uOQOthT_S)i|Oo!l2 z7YtM4s8mugWQlTeK%;#jc*;CBgZ&-(+NBUI&{d#~)ysqLAd&Q z4Pa(Lb8rNKH5o@xkf1Qy!6QZebV1c$XhqZNVG=L_5)camSA`pv2F99o%)r`asQ_pS zF4~D}BG#@&&tp2cQ|^CwE(aB%f*c+nBMmGlAQK1@4T#&5gIBMwu6Om;-J^&1ZkH7T z2vQ*e(9?jVT%BE=zj(F1c(ptGw#c^D$q`Re&frh8SK6}A)`@9rP1d=R06?CsDsL5B z7p6cy-ACv>PxT`r5&%7&P&~wgFqeCmiFW<2GgfHJh@(OCr*+t@2FU&9*dgf6A)WoM z>xA@-TBS)%SYciMA<5cVLM?mY@#1vQ2`2wWt^afl*q!YQUCy;G7|zIG8^}X zsI4C?YaJo2g!3>QYbu_^<5OXs|2qh9wa_B@r zkLrXp&u9||ts1|FA{NbQ)O5FR71=aa|E;Ruz6;P!Pr|ooqC`2N<>vr+i}qOdK&H&b zwB@FtKAD)Pr`QE{L}W^rV8mk3SJxv}%`m9|kY{3P=eag20H**IWP4L1NO%z<=I7#S z-LPWRaqs;*F5LtKS|ZoHJ|xu*Ikaj)z+es<3G8UE*+Lf^bK`tatwk$)wi!DPNNa8G zYD@PGb>JE&nGmPLlJ6G_lbOC7Vr3y|Gp2I>@m`{6F~iMtEhBVG(yQ|jLT35_L7Tz0 zIs)@c#S%+i0^IXBo!!O$BKbz{I7E!^CfX*3)o^W3+Zb4ug}P1zn7;Ui?QeFS_AE{w zytK2V_LMwz6l1y&zFjiXcV;0%ciR@zn1o?Aj2s2>;uMH0%&=GRcHQ+eu!FEol5g6^ z>;#xci;UTgW%3K;t<}yK+M{4Yy0XjURfOq{#Bl-+Ugs+XtnXhWA`lu95~C3i05$ex z0X~#MqP=m*PQMXC*7_Pv712fzh=jlekf3^%cB>UY0Dy`}(}b&s?@lN8wjfmqki=U9 zG5`SebcRo6YG%>m*a8R<+<|wxP z>||S*{j+I-fZ)EC*7Ngb2W#eQ-b7o64Q^xT9haHh&keI%4Nd_M4aa)K#Qo=91yR5v z&!AB()DprC)?XDRnBQP@;(|nC*xS2$Aj>B!&P83kk6PKJvQ-kXewVveXG`fm*3nmRfh?IF6GO zkFh9o_a*jENQ;w9*dM`>wi085sVUp z>?^wYG?f(JOh+(gd!|cF-cJ}D`-+<*F~7yB8SPO`TTT{YgLt0!DD)I6F}`TwG1)@+UwAj4=88R&MiF10HKY+Py)GE&VX!kZyu+2 zT1Bf1BSGY-O+r5mUTr91(Z99z0|6EUk%|bw2t+8>BL_hkm{6n~tscIASymHk0X$R& zu-2E>3b9rgs|*Ljt%KnJ2|X(x?FkV9HdpJjmoIl0r{nqaq3%#B5=*UyQk~q8)>NhCOS>ih$XulArGs!!NYs-wt%u3AEKD^yjiHC^1M1tHS)C)_Px5h!c z4T#fu>=wpj*@fIHNoagiMm(<1Uv9VWfARe6_2v5?ovehnYV33lT*aej+h~gcrL0)z zzg9-;6RL~?xMAT6K;|G>bj@4LDlX7qV@tQTgYHC7SP&Tjgbn6_h~{8bAQ~!5tx_x3 zX{^(@-A>zGovIjzYfO?amlcA6W`-GgGBa-qvzSR!$Ws-;Jgy&2o?DuvVdr_~lV2SD zJ56`kSJ-x8Qc)b-mM@%hKH9E7sRa>^-eL_6c*dG!iyPPwxk@m&+iYT}<{+9(4m|>h%{LI6FYE^60cyn9TumQp^x2~Y$@}*KIiBd5iDr*m zjzqY^w)I+UA?8_}3k`G?gmJ^+i0B!5%|z)pRqA|_;{W`P61NC2>$9c*h!Mr_`W&Dx zwWT=~Z&7`na4s^_m*8*tnwh{Q%Xd%#>3~7BrTngUG)PW90|j`;PO+ zZ@Wm4)@`<9P_9vft&d0Rm_m09mXVn@hZx(ZXUKX=GL|NQQ5Pb_#bUK>p&JI>>5Ebn z->*3WE1{#kFLcjjqlO5@yhipyU?e1lidv(kt+kL$D1XOUUj1v>#H1Te%+wH{S?Vhp$@F{a=(f1N&HGBrPU=Dhcam_CD*HwNXu^Ap-hK^HxtG#blB|lyn>Cnk{tVS{ zMKH<;8cQF5)pM={z>aE=$cS$Q6-u(Pfnbc%p+)`^#L8e^H5VX@wsLeX4oLy?WYY0F zruzLv&t`Y1QHT(pk=})+wWaXS8_ka0Cyh4xJXh;@e4)B{J)V zu=sMmVE0>S1-3rvb|TQ*@x)9;W8iWNi1$N~`A_mTOqmu=z4miBvml;tx2Jtw=j2C9 zXBuVp);cDv(W3k3d`6r7jx#g=`?n*kj=9Oplt11>V#OdELEeulNpw>t{kO7a%li== z67}mfAFW>B18S`VC>AXYw0MlNi2?f5GC_3HHDi{yH>?q2qJ7jR(Bpx2e)@Zj8p|GKotOq zGH^g5?N$l^z${ceLmQ~*z;L(Sym|F%eR;OMcmcahuDdGL=!|}9ky<+WY)i~Ufr33W zC7Gd8pFJ?+Im6n>{6^jKf;9sqbYT#f?abwV&_9@&nbF$h3#;2rRP=zK(jpXYd`uig z1gVwVpdT!gz`_iKl$X&5fp^#vk}I{f^Y6-`SBMZ03<+# zkgdK!)M^Nd^15n-tiD{a7b^e*&(XFc%n?Cz=yl#0%$q=|(EN9hDic;BASyKRNHmUh zJJxYx&?9$(G_pNx;MBEV@HMWmSbI=<5qx|h5~i{p+NWE=e*lgtZ7D>++1*Yip;MIN z5q1gKX_o_l1`B${8k|a&Kk+!Qw@nE@*u|HHfyn(231&zv1Y)qvdcP!S;9ElgD0G${ zS8eVPL1W)$uLwHy!5|6lFC(G+JHNen!Lsyr8a#H{FGmXEq#(r7G)W3X&d6zMUoatx zB&w`}A@l&W+?hTakANu5n6$lNufS^AJbRt5b7(e0Ry`_Cs2Q%MnP3>Nuzb>+>hlw6 zG4mVuTKXkfm2WL+^W=bh{`tOtiu29rBJVhILEg-0wk#?x6>W;$ckR-mX9K9j=tJ8s>cE*(^yue?Oh@H@O_)WB@2moqT?c?VyD?CDE(_TFyJRQ0zo zmr<-IdT-16rhyPms8RK^w^ZYaCR&1K zK?z2)0?^J_Xe175mu01>08x;L5DB5EH6$wPT%Z)E{)sd}-U%%~_1e*Kc0GczOQj)wo`lp{xou>ZH}McQrfiIy>0MHW&Vv<|%73RNY>m@3xz# zFE7v5d~!U4@(Fjg4EEQB{1a0`K_ErP9(_qjHi2zH0i{b9SXQwh3!7JkB{iP(FO>X_Q5 z?ZOtx6uH6loA^iAWHHm}Cb4Ei(RGR#erw?^M4YQCBWtqAifR;&bA>2^?X9Yg>Z+JL2Ti!ckJEF|zZWQxx&9&V2~at zq=%oO5CRewbYO;1$PGIo`YA1yaX7j++*DcZB~1OL7($PeXkKI7hjsGac0Jf6 zuS;z2rC~0gh&WA^3cdg7cYpAsKl;w^|M0=P?;hSdSsfp#OfmDc-CdnueEr2&zx}4#8?P${zudrB)WKg2Ys( zT6vnP+G`OJB5AqXZov}o>8g_&+vG;BrA|Wvusu8qO`4ULDexKO3VYwUW}}`wnCbQ3}I`ZV|(>Gh0{^hUB~rm4~b84n9f<<()A)`!qj7sE^He%r?R7JF%gQ<_B0FOZaAg6+!A(1)q? znQwa&2OsxU}WQ7A1)4>@X97z+$QcCFcT#h}F{b$iDIfR%9)tai4!Iqs`MAUsuOpyI6^(eNIb=RVfU)3fc> z<#>6@<0bQMoOT6V&9zzg5SCb0O(MEuqCxtt?rYo!EK(q^(^>Y2M1%lfVNI8~n~3-P zW@Eq8+B5T5r*}X2@K68Q|KWRo^2c}IeT)N5Qx)cs8NFfGaJ0I2^v;9#p8Ua|{N(w! z-~Pq_^6&oZfA|lZ^NWLn0Y!iqxRo^qZWocRL!aYuG?Ig>D`z6C({{H$KVM%zeSP(# zj~`PLc(k;95oRz;)qJgFFeByD4JkVMG7#Z@W%Fh{0D=IZok2OYnuxFf5|Zd)n#SxH z=+~ZC!dzLVs^^#MquAm~q8z+SSCSgXRk1Eke|B?VA7C(@_YHYAm0$e+xI<87I;?n2*3 z7S_g~nVdItp~)TB@&aXEe{OV_5yl%}S;sDbORb0FJ*K00tyNWKujuh^2@I z@`wUunc4piJ;&C-g@T}4<<%ItOAv}Dhr~+ASs3FRBL4^#L)sC znwKd8<92s`b~diBuTNi2>kE(yYIDua6Y9u1a*s}6u0a~-yrdTA!G)#sl_Y^VOVEw` zDulSL>+EU>%v@HhAN|Qc{3rkBUqAltcP51GG{SB|0cIv5T^JUwl^Lqkk;>}5Pd@%1 zKKb|ufBd8W`Tzd^{PtJBIv}!4^8Q#ACqz@2z;&-r85Jb0c>n~db$5Nf+ijn|I^RrB zZqWcdArUZ;p5=`p2>Nv1qAw(!h z0xZH(QHtf<52bi>c(SJPVA@{0kOnQ*B2!*1+Iy?a!tR!YL?+VNw=qT(viEgB`U)ns z%Kn&{;Pi-~m#`+|qfe5*oa8hi9w&y72>hf%m*0qkLPx9Eq*%}m5v}80)a1GQky>^& z0uj7W)X|Kue{cR~ro( zVGHwOjoLM0BN+&i^c^Q_8r5M?HE9L(U}(FwBwd9enIRtLA|ghsiWbS630G(O0!x^i zB96ComjxyTk91&GM{|y$XRwwg9Gb`2g$v_y0*2@TlHWWN-|$^i5N*k0b$3VTDhd`T zEv;N<$vbqF;8Z4!_Iz{Su>4IE&9yBFRwg9wC>s^vS%i0`{wN}!&@#;j`Yoc zI~()9S9T+30%NMr{|K-G39QV8NBWNfp0$Qm4MMf@ApNClM_YmvV9np`xWL|h1n^_T zn(~zvx6ii|$PT#&X>i~wb}TMeH8BVj@JyXgBth58fCUlNmLoOzM5w`A zczrQmo()pRT8ohmF?+#6=?W3EC_k5$R_#8Ap}L7I)%V0{mgKNz9R#kSl2&grM_F^F zP&$-h&;)ifXIu|&-TrU?)qnq||MFkZ?OWH=sNb`YN};M}4l)oHAj@|Lsna+y!ViD) zqbDDJ@c;V1{@;G~@BaN!84x&Y;8`4_sY{b#6adl&pd^~uK_KJis_wQg-&~ztPq$AF zw3lpT`ss$Kz`l_T@dyF~f@s;JnHo#;)3PluqQYE)2N;f~{*yheTEd(JUF5sPkK?r= zS^l4ZrVj(49!*(mrDDmp;!!{`-p*Y^+s5q7FnT9+iQC1k-7GuB9V*qQ6`dCm4=prh zl$=M5@#K)8edL=IlK#@4Hw_p|ihfL?hyaq+4}zx$WS!_SL=bL=g`;>QGNTH-^wSc~ zNW6{=6PQb+p5-PqgW*M`(y)T5FeMgk-DC3HiORSSJrIdRDcl8Mecgh~L*+M3&at5~ zSBVWlI4xkZ-0s#)Owzwrdt|tvqe?Je-}hK(ezB^MrZL=vSSn(3@=~p7icdF}x_1lh z5n2a_zT!QcbaDI9^hgJ%(W~Qv0qQ*draGMDcq>&9|LvwOFmt%b0qFK|{I*{pBo>=% zn7-^=9{LB`GcbGfeSiSce7^0q_glW-1DCj#Z^jv%5AFCZ->-X8sbsJ9@f*SZD)pOq zftbwv_wxFC@7Tq&1HtS~P?Pzh+fY59qY-}6)ZSiFtwTk9w*=oRkg2k`@m_G;_IPy9 z$qa1cquO^{IM)}~;+2w-8~}uFApk!Cmz@Y>g$r!B9h`1bB|=06(K6c$5m70{_^DC` z910aeLM-|olGYCr0+v!VIm_8B(1Qa>zq2~72X}UY6>wq@Hp|7X2Z)fFcePe+l%!VQ zSPzBVA|mUn>-ELubbU$V8hDgCnI99Vys2@8L!3(e+7wzy)cxMQI>m&bWi55JtaDlz zd^;ttdU@si<)I9r)VcEE@yS2?H-G+*{`_Czos&%+8AM27N@Pb_j7eMHfxGKEob7IR z>%qN$^MCn2|L`CG*+zRUXO6Z3Nf&MvhTOK!;SDV-8TcFacsm1*e z5r%-~5FN{m2Z@|wKblfow}bY!350-xdLm(LUkuJe5XDYGmOwQo92O1{)T1+j1}p_j zp|UE9(^dlwC3^YW5ryavj_w0B9U2t0AA{VX0^4UnoOH^_zRwvuCCHVD(hyJ)$BzBh zm&odG(}5vWj&HIjnnY364M%pJu9ozJ0pIXObvc6}*qtr}AjqOKXceiRDg^GHbwaJk zENr?*DFMI^^U|LLHWf#rnf=Tg%1wWo4lv;|F=*tRsz?S2)Z0Au+5Y$c;lP@vWxF`A z!Oi>**y&LDJB{N>p)sGomdU<9!sZ-m|GuYEI+7I;O7KpQf-Q^tu+xjKgKReUt00Z* zI(o@aV8(DP72R82SuEWb@FW{-@Udek_vv0=y)LclraLZwzL@3oX_{#dlHB;hlpX|m z3+F4FW{vU8;ig%EY@HTrLEoHFfK3|qEy3IWIh&bflxF^&_P-*b7=vz<{kQ0*H{qwqI1mm6m9Ii4=rA(c(dmIw$dMFLAuy0dkcu!C$*}goz793ng$^JhoPL0{Y5KHj_Eev+i7#+tKjv*Y6Ld1dG=<3e}NTE1jN?x8is-g!>}5PewjTgYXM)4gnDUigeMkDC_W*m#9I#hHEoiB zOS@FVH#ce}bm~QM7K60bH?}dF&p-gcv5cWFnzNZHRdn~Q2|P2fAf)xs=K}!*w)2#b z!Qp#0(^z*|atbiY3KQmZ*9(e6mcLA&&G|Mm=Q9MjHDu9D48xN`xMw z0QyA1KEr@Pi?~lpp*VZYY6V9P9193oa9I}xNsrz{ftiv~xgf39c2(Y!U^=&Gy4PXRh~qB{sv6H(2p*Ox^eQH03_-TN-=Aq4DhL!+1WLE$~mi0PY7u1Ihj*j><`XMw10WTbrL*$6JDcdx0s z>7RRD{k%F2g+M1oF<0|HmUodhfpNPo%7$IMFZ&fUxy_F~Lq#zLSNq@;J0k26T{m|y zdq8troTbMQ73T;VOy-2f9#C!K?I+fsnG$^g0C`gSaASsL@jRsOdBr3%y zDMCL+hb#>Xun>|azbiN^Zhy7PP<>iNJi5DqVJE~;)QYh00%iu3g2*hwh9{K%&_3>B zBPSl~^~Ke=xtcZ?!n=uU>jq>J{`d4dpvlR51lAT>^ALAuqjc3vzGQV27rwxCq z^?N`5@t^(qpUcU~$l@9s5V30Kbc?A)FHh$iK*$OXica&i8y`M=_^Ucso@= znjm$F@c(0M+?U5FfQ2>FOZlOKNWjx}Jx$ZAv-QYm@B~>`PiI>>;L=**Vsk;P>lZo! zsq4f}sRjtKL4knifxT9HDh}EtiX6i-8is2zC?P~BRE9FF=-^;DJRDX744w+8Y%Mj| z6MWbnN04;YwVQ}3JRwWL7vF@STPN@Brda|kEX=%fFWo;wBBSt(5x74A8Z2YdI3xt? zsObi;Wi_Fn$Pz$`ln4~7(X?}A%={92(zza{-o}mQUd7WGJ(JlKhsRBi#+U@ikD+(j zb0St8QGr7zZe37XAVAtz+-TYNLwv>2+pLR9ns(Q%V*f{pos6BJ$c!4P<|5XRq9G)7 z7aXJ80zxM9q7G39r#_5gERsAMpb`&_MQwpU7d*S2%^m=GbsG6#0_CdzqO}Ijg1S1L z>p!mnXc5jfWBu$c$db;bn7=ZvTJEd{<`_t{G0Prxy%!KbGTzyQXOrx1)Z1vScJW-i zW|EsC!Z*D3Fd|mAFXVKkuZgcU;(nWyOI?!K+Y_a1g1xYEIZQ<@jevQrw5mn|2keoNw0@_+05Cpyn1ONbl07*naRB*f9U0+?-?S{9P$P?EQ z7Mv|CTp?#<=Zb`s;%TTsUykO+u`$Qe>cKDr44Lb;rKyGwAKXlriHNaLr#nqiXH z9T_zeyB1N58qj+&5tISTK*LZP6(^e6h^QW;4mew`IT(!h7f%m!y{+HSc1cT;5 zG!N?rFYGeI9)rxgDcba-vyIXst!)`G{+k#n$+LuM*(D24%zRTB-42}*3DSM9!KN@% zF*5W5*rnKDE(5%Y$%$bjHvNDQ8#W6BCMGIr1~eEic22OQy~lo_fvu-FLkw0N>V7z4 zVi~colNYh-C%8e&#rJ30(y)DUDrVEZS0T?nb$dF83-MpS$c=_S{YwHmL+njz1IT6` znkrsgxv3a<%T4nHg5w7LK-#uyENo!epxc8Qk-Wj0*z}3~DQ#T#v?HE*@7=WTeTw*? zoA#R_<@`F0%V}z}yIt0V*!^U_cELqCLK5?pa48seqoh0I``sQm9a|q^nYhN-0Q%pw$E-Djq}YBPxi1 zgi=U(0YpT@aH=pAh#>%#Ls{M0u`>4}taXhbUf`&~pOI^2qc_?Fr3O=*^?G}~uH%l! zHSvg*v6K5YiF>A~_hs7;V(MWJi@R6IvXbh(K%n_Lo>pz_0)u(ph}f09 zhDej3A~at?&Ors$dqq37iDjYbuM!1ibt{F+K&Vn&iuyZ@UA27kS3Hl)J9~z(sJ}qe z!}o^0#0iht#x_ywVtlR9064IjsepyYFEf!u|9yDv`j6=UCQdPtx3X;li-0+`$jk6T zS$6?i8*ysR#nyWkv^{~*fhzIBRtSlacAZzvBgD=*+0B~lIW(Aoqi!R~a!Y$3rU2)t zCyT?Jy-;E-Z@0Y)G`rgEL6YJYkw6M@EecE~5<%^ooNvw#(W?ppSUev@93nP&Lp0IQ z!{J{>f`}n+qWJ{k9?Z-lhQ{m+b1X^@jP_Hiusq((#(pp3wG?%LV4(M`MK=|T+~nC8 zBqi`=dPHEp>xKtL%n&?O}YA)HKz)SBCMf6As`xPC}kMb2GLMxHPFfv*ijSPJyJ+m zC{LAxCzmNhSJpAh!I;J%3>y<3Fdgj#M-h&qaf=73q8AZnX4l9dnh*^Zs1ZPB*=@(& zb~A0)JnjUfM(aV@&w{%_?*wiyaMP(t12rq z-+T9-6XC88zC@gJ@5_dyhel=QednGNC&I)1=RaQpQBU5nKxMb}5dcz3Ic1e$ZL}NE zN7L-vsoib$8)YKC1tm7WX}ra5j8xE0Q`pR{#7Md!s@Ynpp1V|`2V3oL?H2LNE)=O( zE_$weqsOq9o$IW3;i{4EEEaNA-rtX-u@ zhEBVMv~(L{fik5Fek~|dSTb1Q}iXm={o-Ig5c>N z(Wx4VosR86v8+p4!(Bvavuaqg>o|vU+|X+QblN1)$~%RyKnN{#xCZXjVby*Gmx+2Y zPJ?$Wwy`XtgqbLLJWri+h!$3a32`t~6f_i(QOwl-L&kjSL&-D{D84eP_LfnLqL!pLqGBAKBNclPDqyNNNQX1QM2n z2|yyh+g%@GJ(1U&CZmB3^@>~rNnoci)We`elti#L*HClOLXRxfkPDd(6cG?2`&Ga0SWaJAV3K>=i7l=d_* zHr_kgXkT%#?F}B9cgR9w*+?zniduVP1kW_0o?nTAQ`4B5?C&Vbz_+(31F!>Z+C%|q z=PDBf0I(E~sOxSQn`~Pr6_$lUAXqC0K+uzf!l4C2X4=GJVMoA0RrjpuavDv<`m?#Z zQ+EKM!yoM)fs72yb&bTtTbUT52A_64^{hFROEq>{*t!kp4bFNC7{RG7WOM8&_RlzJ z>{l2o1{gkp9(Q@HWBc1KxQFhyq7-J}fF=I83t6^xjg_>?#@=2u!p8ZJ_N~r6IDXdR zam(l)LL*$^RCk6TNc#6Zxn#!+dgo%tHQ_TZ+>sOT)L_aHVmr2U>xuQs!NvYr{(b?B zF!bAE5tp;7N3Shjd@;k_cUvK(tAeIZkFR%CZHp_*_W%Gq3feliN;##RH13yjN<&VA z{V}8=rEKX{(Tjl+d2~gyu~OE9a8NVYHHn=7kUC5yQsZs0QQRm349ID_$6<25O5N$g z!4rxAREEk>MH7qdhrNyh0czp>elO)9^PZ%j)P-x<>pWir5yOA+&+z$Hi0630R)8%2 zBFp;06&10P!WC#c)-QP&KJh)@mCkoXI1!0dfQrC~*6=mH835Ok-8`WZ6IJH!P-g-` zqEyR#@7ZTw`NYS#^yjJ>{PA{wc*zwYfB4s{tTR}*Vz&PV2KDt__wZb(30)!gA@QBrw+02i7Vg2Yp%2lp2iW@0SEN$So=YE_W@oexnt;^ z&O&rLy1mGW8sjeV;+*n=M2J*Z0O$_;i7BU*bisoEJQXuqDpK#C7PKy`wCGcq`(t!< z5_q}hci?&yemJJPj#*x5?|wSS6%+SuF$aVx?R3uZ$fZ*tJqC&qhG|#<9f8H9Euz@a z>_{Jz>Y1OI+kOD2-{KVdS-eXSz;q-eces4Vm#xW&6-Txl`BOxqK}^AZ#u}22+Z_AE zLGSe;7wM1_IAA(8utlLFEJoG1?)ax$E+9Z4k6Zu%P|iu?fjMhatDI9FDGgd3n2@pp zDx$1CuaJ_quu4b?6KUiLVyD@5B>_ZC2&5`TLWi23b!rY#(l7}XLpSO!1B-7g0R*Zd zc4{KHw3(-EYsrPnev)aD`JezRDC0IwOE&;C(RSUKq&M-W1##s$!NO8BEprzo4yV-3 z@lUPg;_C9{S3f*~0BJ*1#}O8L)rf$g2vH+s(XEX3$s{7{d!<&NEw+`1;R7H07!Y|G zlMSuq(7Vi<RQXylBQ-iMk;&}IA>&8a&> znG5JT7dv2!BEp`kS??BhaK?hn$fD(thOKI(;CPX|HMm^pxSoFZsExD}=m3B~$m-`7 zeGhH=;_v;hyhOtc?GdrRkh(x{rlb3FXBwo7jkeMQE9lYvrxeY%X)A5CkkKt``i^$Z5Bf9P!@94ob_)GBQDWQIrMRcp4{kip4nr`1HOa(asq) zTfA6^)j}imtQ*4m;u9Q7uj@|GFE&|5@y2_D2tZCl0wkrQ0Gz1Ofe-;g9M*>369hm+ zdn^DU2t{^9Y-B{X95g_(vLlRWf~8{{v;hI3T!FNx&Etc5#5y|H0DWgf5oSFXmYInV zv9gr8mZ@^7TqmWkNSYZy)SgB`$wLGUrR&Jht-2Zh9tqunu1wW1S9t1Azo@IUxLzFN z@63F8|Nhl8&sL4)BoY8560Uxln4OzV32LpVu|kUXveyI@60DUOfq*F~1;`@x`Ila# z%|>c*+$$0FvB^V3Jz3L_i=prwJiJuOT$r!-lW2oO_ZARQ%bA!04ltr~8rpEu31EA7 zvh)Py=U`3Qh@46u|V=h5N>3XrnMpyt5S)>Y7k-~M5go2f&R^JmI@zOm< zL6r;W7{DS_7Auz^j!f=#&KAAnL({GyyPGt(prGgPByTo>%Z=Y1-O{^vCP?B44?HVT zVWNdB4G;?gvWJYt>s1*dc4bX^#Q!iatc!X1sRK%yxt{S-HE?R&9~$pya?(BqXyC{N zDNMzJbI>pW>Jo-p?S)2lMbLMCg?6my@VEZZ5dw(NgDx}$E7r9yiB<8LX<;FgKvM+k zzN(9i{;2K2xr5le{L1!WTR>fbPQ+e2%y{1>JHI za`jr8nOE2J;Qa(d>(fp;%A`S=<&iSsYluhM+kIfo-{1m9bS*++Ky9&oq{nz>8Q8UL z=gH$e3h4#!_ylFdR`nEj@ z*Mftm)*Vcrg`>TeqMTDgOi9;^Fk?c`Ox7cF^yI;adw`$Mtcfjz9`@JgSc4#^oEw@0 zff|P!O1M8D338#afK-7B+9k6cS^{SFQMj^*9tDQpp+`3`BM?C4GS7!vCoWS0m|0f( zPF9QE|Eg_Z>>j()S!+@7-+Jt2B_V5&+jg>qP#no$|3neFcmMvl+a6T5)FLtyB5RvO zGOHyliHMmAQxzt{2o0Fu>vWbbmp+@B&o3{x=jZdohbeVA$U!rjF>{x#AtGozjR2Qf zn5VfiP&OyQx?T~PQf>qqnB`TN%^fi6EVKQWmh$QZ15&T+!|iLaCi{mkq`rc9fJ{J$ z1u8RFvBFgKH@tImFT3WX`{#ig+>BYGuzFiWRBHG-(!x=vG*lQd9d9CZfNS|mJzNQg zJ~RcH*ezJ9u=;rP5=yzXu{%VA9vL9{8A{y*nnI@_c!Kai5m2v7L<3z=j`Snpwj_2Z$;is}Aje}%Pn zhW39D+X&*c?&UDdC9qw<4(~dDyKT*0i-)>ckPT)GoD(s5jo*5XO6TpllVcfLb~o2o zgxGJ1pqX{z8BSFX_3zj!+~Tt}7+SDU9rxJVwi7HD*m;-77z>`V`kiRu5p+BGgTA2_ z7mKf8x0iaza%?FY>l)~4#b9>!=Y;85S$YBKHB7gi-QG)M&gj$&;!-a;ljR8YVW+&-|2%@xtLbX}i;pmL0JXMiVK;!m-MtgCwAA6!wxP-S z@zjDy9#XROsW^~XeN{CVF_M;|Nz_i7bnf2s{MAKiv}G4*LO-LB}|DWOxr zE{jR`rybto3dRJDknP+q0RgU+>kM3hD@*Mow9pZi+FITgRqg*`;TMXs-(dY*FA(k$ z68TqbyTpNpk%j6&;xwr0AB})#=VvqyafpO|k+~A4Zi{NK0Zrs&L=YBoTMG@+Sq3o? zGD}K{0MB;Yakrb^dlw-IkU+&wj#@bapeQ%S-DYqziNYWzM%Me~*k#n}satO5Z0|J#4z8v3n`GB_lICt%JMl0it%delZa9Dt z7_TX@mcqfIS+#=12Yo(wLo^-p-Gd4pEVBpl@el+gJ4esZ#?kKjxTn8=NH|hmglg1rT0GQbdHsy~&iICEf@P{dL;F^L1Jhle+1?>NZ@35R zx9*hK!n)(B%a+%7+oS>SrTGl}A$}0Ok#(nU{*=#+Ch5T6X;E>;bP+Km^@H5Sb;Nep zy@GaHz$u3yz5Mqt+prxptsA_Hf6-X;IHYyyBtG@+JhBwNKo8)0Joi+Nu&q&BJXlEk zLIZXW?@Y{T=B$TPo#F{AvwU>tRQSp~RUUdxiwHns(eG~b=oO2m#*K1VQdR3ahur3z zGYJxrx5Vn$D{@NTSr0Vt+Rq(pK~DkErc-8heVILt!%>W90HAGK!pg{)svuh(TRVRc zg~dyrJPXIa>3YZZJ~^UiMrLM~T2Xq1U`#tAP$FhcPv#Jqr#La|EzvEtllq+)Ex0kG z>$Uqi3nPejk6=q%uvlFp8iqk6JaE0cjGK+3K+jx5)=uuAv?5y$6KcOfCL&-##5f7N zSI1h7!@}g5QbW#TCZ!b=9CXx2tC2U1xNeB!-E&w#c&^Oi3}(N5+e{Ilfc4tIUJYn$ z&IY(#33o*dFp&j33@-~vcLJhQz0J<4G$QLl3nPiicD?9u&6F&}yL-(Zd^jX({y>XaSP;{REJF*S9PK>qhR|b@J5NuYYKda5 zR`lxijNSbD^e%O!ZW`0<{qAmj&)P(-kYb3H;Q@k`n08}6W;mp6gy8p}VXTus3xvOT zgzdp4;k0^%Q~PHHM0{F~U{Ft7HPY+&=Bi`5;x_f}I-7O$4!8g=4$zgJU4xI4@2+nY z!)|;zK!iscE!55SNfN=O!m>(Ctw({d-C&{mVn)MF>N$C44jm4iTs@5r42>Rs&SLfK zj5s^{7+r2U<=I4T*#tG`lnGr=c#k6VQu|=%T%YP{_`zHTAgplA@*YBt&~EeeyV-8H=V!Z%i;JtvG>+f=+G}ro z^{YvJ!tQj!T8mAWzA5X`gaQb)GLb=AtzJ(^B0@+4Oqp1V2Q`V?vX-n)iYx1~aIK|O z6ONAO6fcJt5Ibnu*@&F8R^Bc2xgH#8>`iSRzN$lX|E;M6+l7S5E(tQuH!Go249)x~ zz_$}f*ry!9v9w}*-<6h}BW!I~L5sT>1cg~xxG-~Y5)6=_H+8F;+;eP{~Av zuf0OVPNzsvgPmRoJiGLsg5bi{R!&6RVp_o9MSks=HJ5%ZbXX_9BN%C6BugkL@GO2> zHhMr;fgCdtDk8YFKt-Jv)A=zS!`{2K*O5(cc2PC9dKQ0;mTfJ;t9z0Fb%yq|9qKI~ zw&iMZB9*@m8uy?jjD?viV^_K+Cgz65G@9jYbK|noUey*%Sjv z>`(&%SsbV7%%EucmKefb`V9>TwyrT^fi58d7G!7yBC~byviT1huvTR-(7w)*8D!ef z6RUgYUpbU+$uT-h9;2(Es<9`4J$+WMVQp!u9q0jt04e31$IUQqH^X+fy|}ozyg0vi z@ABT&?%w6qgJ;ezFSi%xyYsVQGp1p9`;E7L{-6FoUi%rN(54b;%-1Q>oMbV0>ifaYK0FfSvvn0ErX0 zyE*7u(<#JteGftt^PW_0R%uG`!twXAEVhtwes$tshp9HGKiv%@Lwnt^p;u9b2oqM zq{}SMV)Y8nryByyhKuHUCHgP0!BO&%6M!HzRN}OfzrEshS?CO4n++2Z-(S)Wf%G?9 zK*6B>97D8M3BcOoc@A$^MLSVi;o&gVfZjgT&-?54@3DDqcDFx)L_-2bD7mb=YtD=5 zci0noQRpq&0Z?0KEf-IGWg*_U*UknwqE@nV`s2C5RxVSo8gB9h@I`F~#)&^@VOg!y z0FMfJ%|gr$I#!a!vsyT21zu(O%Kc?eA(oy3AXdwF`tx`i`W!l8gUdmlL|VsfFYfwj zq{!VDXnFH0#&_b!6~)5o!UZ1cV{|KSi?QoJ+w*Rf?^E$Tmvcb zN6OK!x@%-5qa8KXtG++i3`=vr6ioEW40>xae5c zW*z~|8R^HrUQ<9|mIiD@a!P)Da?nXiC=h`*P4c`f5db8y9c?x^P!j?85mpD7oD@m!)*6#N2g{;ZZsEvOGqOmntW{|0d1G`XT*OqxTsu=5 zkwQS-4vFr`&P@9Bu{Me@{lR+VBBqo#+hH?qciXdz^WEje`PJ3sy?f_ZSG#*x=l8C5 zXXj^^7sF;8#!VUqJzq%7t}+mmT3`O?NB+WJ{-LjZ?vF$yAy)GS@bRPfd79GM7Ca!L z31n)biAb1{tRoT&BVpwrpHxl+Q6jzFs2oH9NR+Oxugf%PhC2ZYdPa@y*e2h>z`9G& zJGh!1WgAu@D~h$KjO-If|HieDD@YJ`7+fk`s(PTM&vqyc%14>C_HC}iA@SpFyvu0Y zqbMR(qyi_Yl?#hDZV(nsK3@PJ3|&INf-OL6=BcHLhTlYzNg_Qp^Jl@f1yNxe5D`GQ zLm)k!50OQmd!!cI{4 z--p1Y&0%cbH^zMeoJP#mSu3;zHC0q@0iyu0zu{VZpi`m{^rq?)25TK+E|Tsn=lCbLT_vm}qpd zW_3h-Do+flrNQ2v>eP|5>&?6zk}qeMfR8|Kn;N=m6h;8AaIfzef;2R+!tsjiQynGumKvyC$150ctZ8x-)j%9L_6kuo}5B@R@Dm^7buJbC6o^H;2 z{JlwjG@!QYxo7qO5pp7jZc&)@h(aW-A47Mt;#fKaHVJUpBC*b*Ttm#bCu5oA zWVNzl-lJzDG^FWz6O8RpRnUi8V*>O*7;Qm=h~EBQLkvr8h0ZwW0y$k1+AtUyy}N=o zKukoGGo?IkH=FHdbGAFXxY%7?U0hvV+`D&n@9O;O^6cVbcX2*!x8rs*j3W|JPKIW6 z1*$OMtl=~iU?xhykT6jk4%0Rg0;c!heecnG5AQ$w43-K}b726Sl%`_sbS0o|HCm>J zKm{N|sMXT45v{$uga2>6{`&s<$#zI0rE4W>gGF>N*Mr(-^E~5CU10`c6m9i7QUEauRAG%jzj;qV%_KlTtRMt}*iu;~^Jq zL1BsXa%42fEX~))pfz0Asg8k>VH7u03YZK0vem`$-1oWt@%?H^%JXn(aukb0Y$UU-CQ&S zb0p0!mX;ml_P~)D08x7Gg%|I?@WT1k<=N%M+10)CtE=;SmuHt3yYutS*;(FhhRvv5 z@RjgWoT&X0nWdDOh@9MoLr0YMI}9;~RhcJHMM4Fo(Y2l<573kG}cZ zH=h0YN68QIPz#eN2}`C_Yw0nGh!AR%1`Ppd%qj_2L=Y}kC_#usEd1J6z5=DdkUZMv z8Q=W|fQDLJfrq+Ku7L<4rI2~_enYyXmfh#38$rl=@Dm8DR0NOHGA*1;bU;YnJHmo> zs4bqmz@8Jm<~+3WNza~CNz?aIKGIn|u%Kak3Nw1Xk((wb2ZEdtqXuvxX4uEUnsPKY z7DEfM|2En~1Va;ew)g0a;$mT1mpe*0FindsqGk(99J|&^{#xDbP%IwUSQ)S+iAYjf zyjl=HMjPr)L_~nl`dC_tNh9UlZuxo`xPzl(Y`Qcl1h5oEn?n)Mc6Y#rubXB(woC?U zn~m|TDG8lz6F^S?2Jx!Aegsb_T%F}Z+mH9%YrAP-bRF0+00K z`#cy_-&*#TC5k~jqt7IIqg{^)^n%p+e1^rXRvW|D1rd==CB zLwD}cS`@|-#8wGzYW1B!@tBw?sSkhR6F>YnfAWQoeRMqE~O;y{~`q%dda=&&DA^ z=VTD#G)-Uo!WX~q$A2VI&&82$-p0d6YK#k@$K@4*GLj~2k#a1|JPgC*_a46Xg)dMd zLSQ0CGHkXiJYEU*A^g79niW9w5O8ht@4&{8Fajn7&kgV+ZUF#+5UMEigbm^{AUUo; z3dGch#hhaZnuQF;3Hu4+4zmymwZ(^NNCE-|VG#yve`Q$FZw4UDVBAeh?uo6b>QpyP zH7vhYEDMVwjT6#nX*CraQ5qwwB6=#~Z5Q-`;aM>28`-gcN>njNOem-~m1k;OziVyK ztz;Mc3WOyBdb%ZtGy^s~=9A%2tTW)~Nx>a)<0}a+JKc^(kC!!&;%daBR^F$eC*{G7 zR@_p1t*M8w3=k|5Df+_-mIzoD<8vJVf&8pY144U(Q$%ifS1IHRda^YW(kN|z(cJ*8 zL!XTh3*Ma*3#;$sO#?mXzUd+dye;VQgvT%z zu`~a=+vhuAvAz3>bwjbPICm~f!@JO4$KBkci#sn84Dub9h;`GVWYY0;hTnArzWc`+ zbMME%J2Ta-W>7e7<8+CMAfY-|;o644x{<`(N}rF~j~wG7b!mE~WB194C^3O|(o2Yf z5Ucgn1|iKi(RX6ynheWYro1MTBN2MfdrJ>8&k+$t2qXa$vms#?mR4}0 zFQ%nl=-Fnj`HgGU#&h@XPhdOb0Fn0f&^NTO5}*__II#(|2Eg{oY4D^yDyWcc^MnKrK>)j7h|* z6cMa>zGIU!1%HEhKg0$?SnZp{&pwC)ov*w%+LTr&bWmWOy65u(zTT5Sr+mfbRU1oh># zi>YtOSf@?~jApE?Xp+bStKcUF$5vVS(Z+nb7F^h6Km?}V)FNsUN6I+nEFx2>n))BF z?UaIJVz-yxj|E|Aya6C}Y1)DjTwZeEh64f=o64X_2WpBUJWzXAZhc2Pu;ePV%YCp~ zKYM^jFcBB;!u^w4fFa6-yAVT&0!9}WLt5a8t9GrTXZ=1)XT%l`dk}0Z!yx`Y@B^lt z_p#yV)TJ0~PlYc{L;H1D?wB(zX+%tS|5hzCs;lh&Eu-c#+^L0`w7j_TtqtFYAZPaiIP$^}ci+ejCGj!`O& zS?S?avmZw#g(35uxOVh#XE+cR^^oD~afhhdD!XGCEeIA*!+w_q#bv5H{OxY2O{(Kt z+`61EiQDGy_^(6A7p~B1p;ybXn3ir?d&q+RHvMha^exEhP2(C|E7~^g9&B3ZBoJ7- zUF-R5wSgUOUPbq?{dO701PmH1STy&#n#O}>x}svBWfSP|GguZKYk$HxpoWwyh_X44 zs8M4#&_Zff*65lEg8)%ERHdr?Vu&fmi6{v{xM1Q4*;V!O9epF97UumziQfjS-!*sa0ovv?g zA3uKb{`-&KfB(_D53k>U|N8w$H&342Jb7}sxvA5{rPNxL#6i-Q7(hfRc`qjsXcn9S zFz5W{8*hC6_dfgMAABVdvB|EJi)2J30Dx3PO?LqnAVT1Xk$Ex)fW{9~9&WF1KJ%-; z4s%JHjR=F$ebz(Ds72B8y~wU;`otwlNyvnhw%c*=Bq$C<>%1r$Zwgv|hbeIt0x-p3 zO?E=_tIV+BvxsafI_qg{aIqHf(_V-e|bMrP#-^wyT~i zVelE7-CQzQ%gIC!%=J)a6{WS$?>gsXxodjc9N@S|T}v~(-gNCXDa56%X^W}ZEHr^y z3{1KiY8h3qx*#xtxVG#JX3TSA-(d+UVgsU~lpasGvV-+ZHbRkGTQ65!jrVG=({_6I z_df@%xOiyWMeAQ3e;CUYpR637egMaT;8>%c`Z^iciwoK;_0uJbC-y^i-%b2{5hsnB zwpfb8iIugPZ%WJ@!LC3AScGyM)7(;{Z8I2SuleeJ7a@yjG)IaM35dZ8-vW@Co+70q zfYu_5+Qx}RNJ^4w3^qX{Pkdn|l0Ur6%)My;15pxDPDq*Zz|FLX!wZ`M^tV~eRa_`Sq`S^@HE@ox{C*m8I4q%%zlhf0+0C+s99CA74Ly|Iy8($B!RAeEjge$B!TH zA3r%fx!&(@=V_{Q0rtR9(gY+(h$-jLSh3~0y|>t$h=4$4p8x%4e&>^){=R2E{?VIx z1`83jq(7%~g_%=I+E82Ae=p))VYP{)pvY$2{O)J|-D`jP#bF%4+H;$m>nR42^dj!l zvo+BQv3FHSX&_9y%|Ij-05K&L21ZDRm74l7g{(B2qC*RKk^2TM3!*V6-JaIURAR$| znzkci{i3ny#&G6Lw`j5;vmk3-Dznze+C$LbA%&Pi2Oso<*3#E^st1^{S;`}38|7@w z7b5}DRLboPfJ(Hv7ozeIszj_`1sXr=h{^ppBod1#MiWA?ZRSwPoo^erO4DNhqtBPa zU-ImIG!9DZe_cwW0hmNOrIxCYd-?wGi2DVV1qdKyM;t}ZR3ZR|a2Op*o5Sy%r-W+r z&%%jS-RMf#&SfHke~LtXQWd`!Jf*lR;8S z8~Lhz!wQNmjqXVUZw?!tFwBd~I{SK@q~+r`Iq3^cjxRnDg~V>M{Bg{!lm8umS-)w! zn_n4((~@CY!-WIc)UOX zhF15%#RkE<1{1Q{IXP=_YV_4g(p(cbtJtStia1D-wm?p%FVK3x-?r)7s5DvH9B9e@ z`gQ^*cls<6QG&&U(1KB!nN!U9$)#;RV- z8)DYLOZC`Kr@1tMs8B9b&ci@?sHhP|R4TufM!}JHg{qHc*3$K3U zP|CXxAKpHGeEsnK>qn2CJbHBdZMQIx#lB3LGc$tZ zJiPbTJHPphzl3F`frObLiF?&8&2u5*;_%bapv^D%fALM6yhx4s0 zS~K{8KRuH`blz1lGRu(~&!ou8zI9)BaM;w{K&cR=kPeJY+y~SMs_pZUL z!Qv@*v|Y0j66po}G$nbOkL-n878)Q72nN{kJrz^HF$vJ*R-7*AlD$k(g@33smBE>R zdu}8@*j8%ZyS}uzl2nG?bTw*#!?AgzNg)7C5j{{vnT;N5~^!LbJfpO|2=}eieH;_AGyszc*k1=D+?Izr5M)=6Sx| z@5?-Mso=ze5(x;96CtJ*nwDb+Wg)l=*7p>;>H#@W6mPgX+#M&z}ovZVGI#!B#XY1 zfFO-&7{?)B>_!oWE~utr+ltM>V;rzhe~KgBv?zKcCyKz)JO)lc^Xy%~#DaOSFc@)T zFk^3AtPM(7^pNLv#-%WN`5pKM(4!<7(1Dc8TU*T#8{fIXxpcvLbb#$$xgzli!`L_U zgMD#$_-dXP*Gnv7M?f~V0X<8uCDWSh8yHZABQ@l@@)kp{vinD7Ui;)NhCO z>D4e2=>IevL;j9Ivtj=h=uB!%EkuJNka#p2J!jgM;`kH>04)ne2Vsu3Tsa=?zV01D zG7-=)O3P7j{N9dg6{D;$M913}^o&J=jvXTM`bh~XF()8!J7LTMc8FQbF9GPZjVxCp zaFB^&BG6n?-=NZ#$q{u|y0xB@=ztg)%ji;!-e;-+`jZXYEQbsoX}{hL=v3cny6dFz zz6*97UvLc6{BKcSf1>j7vz(n~HPa%+Od41K}YEk4I?Ul*JA@fQxZ+(+(5_VtD-IbXC+s zX#p%I>?m?A`~#K*bA~x9dm>J*IR^n=d)7P*=g(E;kY?s0reR1a=e*Ib+T?YYyxwmT zoe>x75h>jMhL0aTdi3yp1i(aymm2J5G9aN>m`xlShw! z;}`zL`Ms;}{NcZR4N}bq?E(`n2g$i(2C<+C5;Guh%84rc@<03e-~aXB7<1BEOlz2e z5lNLGmpm8~9N0o*>bp};DUaJRU!9F0j7VY0FfhIY>!|3Ku0lU-t2YSI00sG`Z6djv zPk|Vu1P@^jzo{O_>3;NwZ7{Ztf{dM^Mkj=%S6goU4Elud1u-DZKtKeHk(u6YJqT(n zyhyRQ`w~5b77P@HUJnH*h*qP(%-Gy59g7v`TD42mPeoEw;Ned5_7ZE0(`WzKFb$wu zSE|0Cx_`|sWh}5rsFI#_YkEd^IuiHFN&iB0WPW1i%t?!x0;9BaY~H&<)r;2H_Sh;^ z+>%UKcs1QF4QH$qR&eLyi19J<-YJ^p{rephb_GL~_s?C1lcd3M=(S&;ZWRF|@ph@P zG$Ezfjiik`{@H=q@BkNAdcp|@&~M*c&~iRqvD|Sef~5=-E#Tn7KrT0U|IZlPF{^Y8 zS&jw|t2gSk8Buid3?Jmg7>-x7ztzcD#M8ek{Z6@q$XVf)^*idSabr`O#GbmzT~pM6 z&T@*LG6}1xJ;Aq~d;|mlY0=xhD6)&bEukv3jnh+B;1;W|La@8_dF~IO=Jf|!LX>*06K2IMZv<%ZjxXVH9E(?K|-G;CTuB1G?`_|k4@@M}0 zTI+ZH=#R{lrc&(Ygq2NfqNS6Fw8B*Z0Z7A8rumotpZ~9a^K<{hK&A_mM|u3r_G1ok7Fb})!c)1&Z51MBK$Ua3&>4s|ILWI!>p;s&D4x#=6L4)5d(Y|dn=bN1Q^RILzJN??YkS`U7 zA4hm%dDvK94^wzOcf;Fp6Y5??4U72BiW#)cw=hoFdYjOq`on@FatF_!A(mcPda5>_1( zmUCk3bNrfea_XG7&Voh zH4jcA+@9sq_j|lKL7ug;rgxzW@Y{0)5i;7$Mxo&%l7b{)Rq&DwyXh%~t+8Q?CjfSB zSe1TbtL;LHOjbJy7libz3xot^gbASnGhzbIJ<eFCET>*ZZy%1zfuYO}!uXb0rbxZ`bOERYP z<{NMP!hiR(@4WfeU;67mv3vHxTyZYd?2$%7nAs&xY+*6yjF{g3<~RS28A)WkGOV??AM*a_`7ZqA1^Jach&u}#1QQ3$jMOc0ZDE=qNZaI_+d7TKa* zK_FDOU}WS60&=rz6NL`j8g~o*o(%ZXf_G-wt)~Ye0uY-Zurv_n#;(CNH_OH_A32oK z2O~m+(Eh|;p?X*htRjyiEUL7hbfy*rw6_?5_{rMZNQrymfrSl)S|Cgh7&qDjq46Zi zZY3UV48#;%mr(B{bWuwVf@ImrP|F^d#CvO$iU64si1_)=hJvL{QZq+n3Eyo$M7YZK zib+z}H!Gs`qJZ^5r5VZ4oC}b8v>61<8Ro|Av_PH+ zdA*1i>h|FUwBCW%9>q<;0(pZ^oFlQYnH>d1L0K)enf|)AbjA)MFWAGTps*o$bWfo* zi52skumiy>(#tssX^qxI{0s@#e#aUT?);GsD4d9J^8CJX+w3QY+TZzj0wt88bSD>mJHWKSi{BPqof>>FAwApOVt;Tn<^_OW zkU}x$yS}wz=~nz!%z_WXyQt_F-RFU*E?P+lc=W=kTa$BVzk&sF)z^@qFfajTi@vm= zgmxM->VqsU*EtR`=dJ*#Q4My)uVXJyL~}OwQH?^d z6J4dlD6w&f0gyG=a(;0CY&#+x zDp*js^}uzR>$iafd1GSGLJaPHuk%x!oU`+^7h$N#&tGmP>1Gl^;)EOD7)G2JK?lvE zHv*=!Iz|q!ED3tXL%G}^d|9J+S%d@ygot)$XJ=<;0&qASZf>qi zu~Tk{yho0xgcBlcHX9-;rA&v(psg}+gd#8uc^t(jKeq#TzNlDK?mx7XHO&z#2I-Gok@tf@jYnJw|T5x z#)xe~m(^4Lzk7kI+?+*rQnaVbER5Zlgk~jxL%rQh4EO@kK&W2LuE3D20I-ji{Np?%)OXLXVuVSJ-UMKFMR;C3vafN z=C}U|T+*Fs*uMU4BXP&e1RX$GMQoq`trf;vVu*HGe`lSEReq9b7;dRWCpo+|Vvr-1 zb2N+6LH46p01uL%PIy|#+0xbT5zk#GORo8<)r9-sJ7c>tAiX?neV| z(zbfFrd5O%1AvG=M3}g@&CZ`RcUyXq=%O@Y=^>8e+-zsnqxvMh6LlfNFe=W|TGg}1 z-0Zx%cv;cbo>u)Hm`nph;1orJUHW8#x`Am2oIxh86`?xBQxZn>0634tTlaY{O;#gH z2q|Y}u+sLtVzOU^MRR6yNjUf0Y-vq{qVIm)OTVXnwDmjoCoK9v$h=VF;Ol)-K)ZOH zJHlY06C#>R`TXyF_O-8k<>TM;J>U81Prvk$SFfIVFl={#iBUwD5P2@s;qczuZ-40z zKmQ;8{qKM63tudU{btC(&iP5>8+=5bzHMjrH5o?m^Oic@D#9s^<93IHFFd%+6j42K z*ke#z88!gv30m|xAONvdSJ?HT6inj9a8;|gH(o(vvcxD!=~RfmOgPf$$K;vFc#-^( z_G<8~?S!!K-773~19X1?K%@h8*P&w-F=Ehr3J~I$5E18E3j?AR=iPRj5|vuCO9&yBQV=QU zT*|!PA8IKekaF5=w|U6S%%u`0ASh)fq?9uY*IHQwSQ63pY=;81)?pY_OK>T=b4sa1 zbai>j!t*>=;puP)z>Lt;DEjuM#ELcs4oVrP9m8SjlpK8}n#^8>LB3LT( zV^DP$qIx=9JBhAV1CCGbBAI%O_4M&C?&HXO@kXa2k52)vYan>)$_SLZU0VRGMoGXT zgtwZv6VvDsdN7mF7_5dkSJJX{ka77$=pa`=hK>^m^KFQ&hxyLA-c9&`?G_Tfixr|P_$&HE?p53(OQqj$^$?o$Rp@cCc=&|2oSZEy2oZHI*?k#30p!u zkmbh<010p4u%nU?fLjA+4K`Ww0V7c|m)cthL39rQs0^5M-fn4oHk@4@(kS(|gT#)a z(dTTTL_$t&j)YIhV!unnuZqm#es3(dN@ua#hj%(p9kz%{)|Oxm4s#xT>z#l1>%Z~2 z-}&ta&p-F#D<6E}l~?XRcm{K-wU&8$@11ww`1&{AcZPjOt=<#Nlwp<~q`ld#i<(TI5F& z8`A1Lik7t}l6>A&^bbRr%O3iy#?wFj+YoymE?5OwPjGU_1C%D- z$DgkrEzma7Qm#8{!zqb=(!k9s%Pow0GXst1UJfrZJ;W0c(Jzmrl%>V$ zoRffPi`xoxWQDlThXR-#PFbcAk2&clxUN)jHz;Uf1+_Pp7cUo#eMj0CsB33 zMVJ!h1ly5vO0u6a;f#QUc^Ckp)S6Pt%?a?Pi|mArDniJ0(QO!w4v))LQFyyRCDn)%p*28aX0^UGc(+ zebttqJHT)H(LKI)rjNCTa%#M9i~^0dcK^xojZ1}n%R#(4gBm$U4?Y^}Wx)Vf;|8FD zURcOFLPyCqWz=Fa?mbxZ`jsA{)dhzR|}e|v94=O)_?a76zIm{sS(wFWcJoLBHj~c}ho2-A1D<=Ajp! zbwn0J;9a?hW}Zs+{90qJG+yX8@-!x|0!Pp!X6bcRSFGryb6`&&fEGeQ*OSGAFCYK} zGT?Mh^C%NR229ouOQP&Zhr=Kg2iblyXXT=${VDPCLm- z?FWNZqnUaJfX)c%LEC4$b40kgc>-~ywDUv9HA-zl7`D5soVU+C^WfgqRjCh=&O}O; zIY}XuXp8L(Yk2Y!HZK$%Q`B*$wubDuKF9#4p?!kalv-_^EYtq* z7#^iO0AMPIaU79Qj}sVjX6EToham}96(J?J#$iCDd7cq5<)pcJDJ8YOiBd`l33+B_ zPLyh`%!+uFNkkFJL!PENQ5rTQN+qD}W-G$AQ~?mqxS??zYps+hEL?!_f?MX-c4J zA#mscsD6d<(#zPHbi2`Qi+F=X`zME*?zW6HPrdQ?jv)ieL~vlG-1@;TGa_QsE?u#c zx;OlsPBY0Jig&4>yXP*!C_LqQaLGi#-V6tH3%|6t4jqfVW|&SGj`f^48PnD6-h~L= z*A+Z|pHukY&R3Ss5}sP4So5HL7HGLy{6@JspVV3i*%Y~Jb9%jSu@6_nbT+k{6KOdI zh~dlNYRoa?y*R}eJpBNdSH{{w@Nmbd8tl1VDyUqQpa3IcPTmt4-T7DFULjFD#U`uc z;7kI#YzTJ*?bXps5!FSLCWi>&A-Ud6GN03YmgM~^AjS1C3bRvpA_62n!BOvR|5imJ z!!YLU8Er3zvuF6x8$t)JHS96K@{G=i0U7V7e-gA?pJ0_WG6K-pot1!fa@l;d9!sr= zD+fdjF;u&C^R6)*Yd2fsZBQ{%QUt@(7a>eKp>Z&YxKL}~D+f{LlbL{6;+i?E z%(57vZDMRhi0^v+qjD{nZVm+z=E`#g0W9> zw<0o^s<&kk5jG-|D*zx8iwIYubT}jcU}i!>!f84H;51E#{l3idhdf4Qg({X(2^g@C|y@*=jHuNpkTBxic(Phcg_D3#SCu)ETKwN5cv@iG0(oW5X*Ztg-?5zae} zRFuf&(a5(hHE%5{{V=j-S$w_X#rFjpn-IZyo5APA*$4-n&?t zzhU<=v&79a3dxp^1~Qk!?PJK&8p1Bqff~eb1zR=+ZcKgOT7kCN?W_!y#7S^yz2Rdx zLHAh?NsF!kdXh^(c=6*11*~LC@soau%s&ROW8-W$5CSA*nRmE9r;;ipfC|h)0Fg03 zC@3h*oKvbElxv#9tQXRd({4+<%Y6Cl&6``qYr(mb;#i0fN^l3jI5vATTqw7tq&7#Z zZE2s-6_47-b5~mn5fi1#HO`Cbml@-U>JQ~)S=a5oEF}-5d7j#<4O57PZfyUmPf=bAQKm^FpcjVM#$7$)^ILrY7&LbU`M}oC7kX&8$)ch<<#*F0>b?{0i7aTl>ILp z{fM(aje5BYWW?&9_|@`97nzj7#`X0paB_^NPDKwEH$VQwc>$=WUgWM9Jbvivx5u2; zLKL3*l3);gj^+kb(VbEh#E9+^lZLJZ!SWZsA;A(Yx*mrU^ zTx&O>F-|?N_{o0#vzW(*E^X+XS zOo=MM#nt_nKlGtjUj6X);+*nu*iUc2`Q{s6eeJE+Uz5W;jzf6Gs766sE4e<^pdyi< zF}(Hy+hnuIZg-ity9f6#UVQd)KHMq`0s_;?1y`+orUZGJ!tRPDv0T3(s>UveU8;`~6|R&% zC@j}E*CLWq0+xB2rs)7i%hCD8`8>~u!(lp1h=_!xR76OW5GfCNx7(CbrfGis_^}Rc z9EVye3-9;)+nd|NW>1N<+g2&%us?9~G&I*zD)atuNJN^Th8`SKAE~J-Ta@0eH+|-4 zrO}+OH~;{+b>xpGql@ec5D*3jIR@RFUTQWnBH!W;&{8cgb}$B7il9`_LmR)-f&OLG zWI+XEH*Brd>DvOiYzBiT-iye^1C(48$5;^7R9kqsZq;{ljfMfzctQI|K1VPyp1~e5 zofuo-UCXS3MoYH{loN;@mDfX3*B*DHgVhto0-}(yO&80XyW~`6kr|x*u01 z%pP}id}jA->I0oigYeB_DebqAu~YjP>7)8j0DrvMV{Eo#-B5VpK!A`_1?Y|;qtQgs zUC|$f2t)t_?62~CHkE50DguizVDHmtstltL5&|$lvC}Zxppj_YZa2I0a{0_~{^0Qb zn@EYd1R{i2S5G4_=h(s|LGV0^oxJ=M_>B<=jYp-PyN6T{NRuO_;Vll;JDkRoHRIBrs?s+ zhhO-k&;Q$B{#UR6=@*7fsdaw>k5hTPRn1NGGs}KImwB@p&(3z|=jR%Q%sHoFsI}yjYbm9aloB8i(cv&XeE8mezemLLi;JtP z%bfG!a5x+eIb}dBWhNpb;ws~29LHQsegDy;Cr_Smt()!U-o1OpFEfsxz?;4$;#t;t_B>{_fi?pH&tc zFl-K)23xQ`@#g}OAVflOJ$~s-69L( zuAc@gj|jiz<7B;L;UO;#e|s_KS72!a?jn0m{z~99E?JRwPrsnWyt?0t%UBQPk1*$`1RqzB6c$BHOOkr&5;E3o7=eZwPli}q;v{C`YLLAcBpxP5n3JFAj0${ngjRC zPFX-2H{$7{~z32CDe+BuL^&A#EQjvT7-U&y)`yGElkcaoa^{sDy^BW)g!5{kG=b!oRAO692-gxu&@#7D@`s%RT z9%_9umBdv!GDNs|_Wlq4^}qUwPkrxi{EJ`w%rE{D&QnHYGyYBa*=l*e{KW*sdwZ@t z4V&%xgK^k?{KGGfRO?j2J+#~<(RhS18Jh7b5!- z5b0(U+Sl60%{LFCNhi^w-Z`M#o=D z77FD^!!C6x`gePxE~cpeOAyzQLa;W{i{#~FN&Is`6MQN>e0o5$zsa}#VmRC1c5LA% zJmvmR|5@KZ++AP)j?35b0VztBsezU>S8O*?Xe|EbDe^ z|G7%?GThvlk&amEpsG7f?Rw}6;0#Kx@9DCKZR41}s(=JRt!YxFNOqDNI}-)~kPz8Y ze{?()j(TWA1n}-b0A8u=&kgs@F4bgGXe?ImX$k-klpXD_a@jG@0EJaAwF*XHQ!wal zF9n3{s7rBR2b*CS&(G8Le7t%Fw-+)!CYnK9DRlUK6~1d2^Nyf(=c}obT=*-0PX5`? z77Zt%&(^mA+6#L39q)H;j64y(|K59l^107_#4Gz|adpZ#-`syW3DxBb!XIElX^L}`+{CIV6`?=G*#-POJG z-7C*rVmYWgPX=7{AY_8r4yN=$Ya3>kijbgGD47I-saY{)Oq&Ej+sU2RvedjW*CK-A zhpu}Q*p581ePirnVD#{trKPS1<=aZTj$CDr_;?M0sfSKRY)}%nRQJWQ-8DKNB5v`{ zrgWGEfx!!dbt0K1B}zmo(dFg&?d>fyZnxW7E2Sg|<7NcFoRY#L&660$ahLNnP2;#p zi4OB*&kuE#VCM0$G~#({{2Jm|aSJctN$9f$F8&H*?ZIB!|rEdd!kByDrG z3amIl2|O&m0FhQ0%df*->qGsOQ{CvqrS>`xQ+;fv#7>8R#)tG;v_n@-4V#i#UKuaq zETjYn1djPkk~Gt`MK>1gok~)}s9j!~ZAm*_39xsZ)tQl4fK_RvMCU5M92|Is4s_QF zmYG%dQ0MX^k3JYI>~tWwE7FLV2)_o|-+7q5MqTL1UU_o+?n#^>enWrT_Mip#v+$+= z94y-EXYD169P9kmY0HFOB`|)&kxlc>)cx6LtJrjI9=92+Oe~3r){Jj?GYra!C ziswCXI0)6qgX*GN>aAeg+QM;=PVQu#1MehDRv>XOi}BiRVPk=P>jmS!5-;tqAno91 zb2M!V;&h5K!u8cKpH<$A%pf9m_?jSA76jxV-T}c_ z&;R&)4~OTUo#*{r&2&-1l=J@4legb|t6bk+ouA)-@wv0J-R*QJ`@=8}fAjDB?I#Z( z{{Aoh%62>WDRUOj5CQK}KrObVlh&A4bqwhI>RHUghhBN^az_szK0Mowi6~CjGudsH z27IMS4@)c}6$cV3!UUC2HrfLVnJBX+{v!#;c`f~fhw(PMtJ6=;D|n8VR>OLr2UbCP z0mm-(rUIrf@Gb=`E-H%s)Qm^ z$_xN3d^qffoRM%YGZDT2{`>kXQ-6pevcJ8pm4TTMEAwGG+}z$w^OW&{TO_2$J#uKpvI#y8(cEBMDlM94#Jk5?md>1;H1@g3vkqX!#yN z6)f~vqn8$7#A*znt9OJ>zxkJKT}AoWm0G(C1e^@%hCGR!P{>F3T(EcXm!3;I{%*gw z??gr6V!F*1kycE%97&(|y&Bv#gT>XI+uyNKroKCjR6yyVSc@sgrLum7qxXvGT4qfxWx#2$hOt`S zvm0oP#&J5)V!X05LwydIyEV%0afqxslo>Hu$qt4K;wT0Xte~!?2l*q>qgw$XZL%<2 z$!3`CfajiM^`1i!&jCUiZTw9LuEU*MF5I+a95jYc|?qmjIHp~wS;Kc zY(hx7CE z4}RpsKm0d-;^Tku`))H%wd5iH{00cQlla?qK)KG9Nb8;aYtkdE688eYPF7r_jPQgRT7*spz0sQ zWVX}`EBttKOV<)@bFUdKdh|?(L(zh!!pw(h(jCLKBEqyk+~gbeBSiocX}&SD5Tf>@ zQroTl)^*JL{XVCxk->2oy$Gm^NX}U)E&<@mwN?~KDV0*6Jb5w>))*qClykn_-=f#O z&eQCO#_4y9r@Elquchsp&^t}rnK(f(wcVDm1VmaeM!iOrD9G+B__Y7Hr+HZ$g`i9t zwuP`A?PCk%Exc+B%z>T$4VZ*Z(zffnEiWy_(8yrdJrZxx=4Qc5`Ft31YU%E#&IPo# zAe4PGY&|0CIh#)RHWL?h0KMjEwyooS`uPh2%pHwzT|9^%;n8m!fm?wO3oPH^<@Vod z))cXwhPec7r?AVNWB79nbNz^Zs+VYVjW&*>mM8PFSFo({fxcuN>vIIuSX!ljXUm&@ zI^IhC1xM2h0(5d>x&%SjtJr_{_$eM&bWeNvzODPH4+i}x1!tzM+nn@_a16#<)UTe{ z|Gke7#%@^Q!tUuY-G~AdH*c0eYr@e^I!2O?9t*D$5wl1r5QSX?DBg-ln~H*cZaUP0 zsY`_@Vdo&!h=6z9gGhd9fzmDtYy1Re!gPOw&n3Q|xRwk61*I^~B8ZY=(g6X)+ChOd zJ>Y^)c^EG)X?MAM@Y40gv-7);h-U2!bS#{aVYAvo;GjpnG1q}hWZj8=zdcq9+@Yh` zR2Yg(P6dG}oG{ z!Ys^`5G$Z4u_^*c6bB3XW6)*Mc8!65`%9ll*ArI&h{`+w0&6yQxC7Yc+LwcSZNA#H z3pLUHVKpfpiwv1txL~0>PqG3c5=r-({5a3^<42G8;~oGi3+Pc+BFvm}PKoAuuC)$% z5Rtje+MvFa^5pu-Fbx3kxIQ67B&?N*P_b04C8eAQORXY6h?VPfI1J-JNP5;G5^7y` z&KZfyJTq4n5bNA2+)tl|hx^2ITO)V8AgJ%Isa0%e@bm&(Bjct_({*M-qgNc5!HI2m zQ(bQ^{qTlwdZEybNxt%dUHXa;Xs3;scsp)x&w~bcVDS)f9S9BCK-=jinPCaUTOTj@ z8R(=vwxx@#Ki{cSABKO}g*(uIevdh!8@2($(AA*<+L$^|GT!khCcCofJ%Cun+M49| zJj)%lQy(%rhJz=cwcKAzF}h<^-~gh(Y^|sRp0!ruNAx9Q|#PYjCRia&6v@=R9!Lil>Y-hP&gf zq`TW(B0Xf*J| z7Yj;u*@xXXUBq=bl?iD`+w*aEZ*%?(oj-T|j=cR&oyS3D*jEHV<>3j9B5;M_&*aty z35`OhaeFqLUCtNJY@YqV^yr&7PXM*kz3f=gbSDvdCd1l0apE$V5A1}Vb#i)lYGsC1 zmo4!Ygn2b60}DlSq)wLL4~QA^X7kbqKOl+9T(uQODdnYCUj7?@_orX|zz06|9Ulk6 zx4!Y_FZ|5UeDO1%`QzXF{qOvXpH4)zaN+v#@BNEM_zjV!C9Ifi8a>&L}C-tXvJWtH%d_5$hiNHz_yZ!5m{2HOqB_rBJk=RTP9szcgY%0)djF1 zAcf}3Es!n5%_1t_D9(Tb?g2-m0at%L6qiOnc6mKwAz`PldNx9vgEukg{3JOMl zv&x;9*nr}~>J+ISFd(7p+sv;H`|}b%@RL2IiFcFlMiTUF{E&rJ97N4TdW$uPXTj_!daQF~%4JX5QQv3KWc zL|VLghyP-hSBnS`sqwJ7Z1Hx|zS|^99iioHtd_t&UvknwZjA%~dO?XDmv&M>K%zk? zqv^JINVZ8NXiS`W#;WqfN&3jBM}=;kw~DcGjOlTv1|dQomdYA#r3gYAaX8zY-QS$w z-<;p4@eI=-X?VVr2TyJe1t!5N0sW{}$wY)H9)PyDT)(jw2o_0{kGkY>ortMVqTo1twE(W-@4pPx6N|(PnKzHFmbCMQe2uGbJGSqQo z?eQ(~Tz7Z$-X-#BMFHf_VTf%J={4>jHE^kRlq0~#f@r6bst!Xxnka~W)p_6@h7|j> zMjHrT=W0rn5Uu;DKoq#6QUK*niP=bo_3l-w@!=bIfRcr2j1Kiy&T;G6${x{ z&xcwChxc>s($agu3mh13K&R6njK!&7O<(u7PGAjXc#^zX#oGGIo}yZNa_bb%Sa0>! zNc#QEZBMNcOn18z-G6$E&<`x2z}>?;!I7^W_yuHb*W7i({*BsGLcsfuB+aWk^{u8; zF$}sX9_kaV!qGnN7iu8y$PO+iHar<=5_S6R7S4y;7Jnx9^)Aa5TudhUY_fVOrcm`Z zsSTiuy)^oAS$!`MB_Ubd%~Y0(jcx(5P6VVqja@J6L*ho}l{rI3*o6t8*B%%O6G0M; zyUp4C?d5Zuiw9|Qjx-1&3s(^2dUZBDe@5>=;fWF_*aI^li?C5*A}lPJO!&#?$h~EC z<8t1dUk(@dHuqoH-2cGs&3h!J)=6{Gj;)?KU!AvV^C_t0!D@$e%Y3RB_y{x07R~JyWPC-$}3;;R}aw<5f8YK)sJ_rb3_DaxP0ydly@Kh&bbCz z3$oBM?%W7!QxN;HLqQPriLpK6a0vuJHn(^{$;gbr1EoxosG=Q0CjgArgQ*9zgq~pN zXf<{rHfO=I73~k|2#l7w*`kCk@E@m`^_4EI?q3lAdBnB7G7wR%j7SJA@W+5wG)WGQ z40nRo`xSr5OL}X^GQ)wF^{HNGQ zuxL!@S3~1#5STq#p%td}2-uyf_FKhjVXeaMi-`9vg~lqWLr-1$fXZ~-4t&6!fOM9? z*HIcN6>@6l-XH>iRRuO0&Z`$&+g#Jdh{z2G1a|Zg!D`R+8p2_#6MZhJ)F2DUf|THX zPj?|aX?X|BptfeCJGkt>+=W=`faTqL=3UN=gOyz3l{?4 zl~Oi&Y~=58C#TcnIsR}(HFaYHTv9UquvZr3G+dCyyq&(@3+j&N?d08b`qAaZXJY-1 z(gguekADHR7UZ3ywC>8j$%1`n{rL)U9!*AM6)cMi^+BDh&_n$ICH=6mQy(YhynkfV zh6d8Qd=qi{R-!D@-yaYxpM?A@z}#$F3+-XNnHZ5J4OM{$2R#+55eP10^e`54uQ!XMKWQBMU+Kwi{9w z3w~Og_yvw!`5YqH;aIynlB2+~wK!FMaaETdF)) zHENn0cT!5hCMh5{ndOV#*{LI8lx5pp}LqO>nj36eV)j z!OwwK?}B=hc@({MzTHJiy#{9PS*y-a{FMTyt61l-eO zPg*NZJ+auGx$Z1D2aj<^idg3Xha)zV9TOU}(L6H@NEf6G2Ii1paN3+SooKgV>;B^B z?0G6@6Q#C2Thu6&c-L{whNNU&TMDOt#KpBC*$Bhxhen^c7S^SRdZOMhw!@NPA%qBi z_?PcocN;80PNb29Vx9w9&luO2*rv2oB`#k9_}URY*j95n&b5u}@6qoX>?C<%WU$5J z#c{`SKw_H1rQbtDYxolEa+o8rp;C2LWrrIf3M`@gF^MS^=r! zK%4J0^H)8LD$rWzEXTP7iee$16WR3L#S3VAO7jQ2ljHj=qG{`?K5ax6PdUlT_228f zpl&q%KfcXRp!F_-WwA?<27-=Z-*RHt0pdu|qhDa#B~7WUU)g6l``c2?mja^zN4g&z147GU00BEvEQC8|2LVx# znFTS?u-okJZ!ezRTs#=I=a5DLVv)++sMqE^B8ogXAD-FlAI)XLJedkXRxc1G1F#?n z_7DI%rh%DJfby_AzuaHk=VxBpKJ&`$&AXXOtyAN@O|!e)iJpuI?N{C0bvi{i$U2j; zcQ}p&Yw?xk&fyqL6XNLi1#Wn(O3~(B05;oAN(stLgq67>GRKii>EHb7um9@L{`b3K z_&b09AN=57`*FJ1?MpEaksWMDZ2f>kQCde3B#uO&PG*tko zRvxI~3Jg~by536IVWUt*9i&(lc66+QZX8gu6BaC&qL$7+`cpjCuGq$H4rzN7VKLg? z!r%}aviWdgr$7b45KNl8X^j97&!jdCK;g+LH^hCKU}w%dOGeh$yYm9gB_^+vjMZIG zhqeG5CsZiq)Rh6+e+&^zG)^<fyX&i9+~$XWGRnO6vgE)e!?K)6T96G#t?X!_}!kv*q9$%*COb;bU~w$Ljje1JT4)01-zBSHn5WFglBQRDp6+ zVc){G7)`_%X#(92Io5kF8z>^DAc6ZC5OxmwE!4xah&8!_?F8TFiHMfy9c7J*936vG zuki{R5?Yq@FV{`K*7j5c#(HSzGXWhpFY&}SGak=vGIeA)V6~=8gL2}>9m=Rdh7(U* z-fArcr+<2;&At|zd*MVL@n_Juq7(OY+}Yo`QFIBT8k!J~X{=Y;a+7iTL7!@rQ1jriHqtG=?`RfVxUM}oLOc@|2=-ZC(qWr>| zgF(CD^4{+9neD}cVRw(x$VhB85BdsZ4rRmssCV5A`NgZ@Ti3S*(~MB10;G&Iqmgwf zbd0bktVBT^YVkcH=IwU8yf;05=Hi79AKrakt|!DI!nkmK8ZqBK@%io|49(mEEEwz_ z2p?0~y{%bE$qLB#F*%QYfCq3}^pY@%K$(j$N4~8_d6Gcd?Ed8QfBY~1$v-_CH-G=X z_(z}k{_mSgnQQge0TyJ2X*vKicuxgr``mCfYD7guo1fLn=l5USK6rU^cJ_Ur{LnTR znPzN7EWj*82|&afeEYc3Uan6zhhTkmh8ZBO$n%y(gk+IG$^ueB0H|`BMMkLuaVE*6 z9cBf(`-9#c-j7>vB#$z*6bHk2d#co~j6oKzBS6B8i}|ba`C}!j`}9*iV&ki_?X5LTv5%G(s&l z8=VPh%#h>S(5VKk-6o5pD;B{nOWk?$MrL&2NeG*744u=b@F3Ym2Ls~?J;Tt&$sG((6bFpD6j050rwtckd~l+7<#lFV%v zwG>`6hHX-T>_7Jp1u%W!*3iu~0AYf- zS3pvG#pK@&X4)!0Fc5l2&qvs&;TMmL6A`nxXS>YK?)ax5*IS2V7t|B{*-3uuglXzT zJ-&sD&%1bWqZmvXHVC}zV&$9c7&Qj!>OI&c=Wrqrbd0@_#C*0$y0qzBb%yb;AH8^E z5W^O@M2nCnXQ{y?^_nI1#0R+b#)t+GWV8ctOjtw&h*SfR3V6dGA!*2=9=iXCKn21y z4!f((<+Iz1XUE+I4m&_%5sn@f9*0B-=-Q@L*+!J|?B({s!^4v&^MGk2m;`dd!6-Em z!crJD7}(B`(?>+dWJ$xYy|_AD-rqd?^6vQ$Ke>IFrAVDTJDA(X1BhhOF8Jy#2c)S8 zm%Fw_!0}cuI_Uf5q)g~qGIKPnb2g;WAz;;c2%yKb5eRD~6Cgf*|9z-6Ayt)Z5N)h0 z!a(@3@B7q;KK$X2|D{jgaMeCZ1Sn8NfCQw}_ul%J;v$jA&2W-lv3}ScK@gy{x%c9S z)8^viA9()bFW-at#;fky=6Cvt)WmA)mDyH-zA$1%Ni3bMw)JBsy^no^AOciH4onkQ zLLNxQBm*U+>fSCXx1}4Ggp4#MByGQhsFN?D{`!UYC25r;F8>SH$J99Wu6A(OXyZWi zUS-fWaA51^)?;TQwfhtR%=28?4`_^o)jbrODecbA#_guoI?rXZ8FR|}!+w9ems$m3 zNcn7cmWMpoDj+#!0Nmf)91eRO@Y(tKX0s`!Fo?pYQtIvX4c98j+wFF@I|IU6DgY3n zLZOrsFdX)WdD_=nrP~sSIHV*ZwN?P2loB8UGqCm|ui|_$;gG#CLh@F#T!|2YN@W2g zGKfQFRzaj9QDrHjy?q8tGb$4?ulM7Z?doqJs}hogfr3UTf0kk%X>QjNv2lJGYELLQE+oB4Me_ zm8*&jwsHp$mYgUL0}>$;b1kJXOG;@Rhd8WPi>9Z;B&Fz9OT88X=HwAyOhhWWU~Qt>|(S5g}?1aZ@)b z(Kv1xgqaf}vrr;HVy-Mw=2`rd57%hHM7v{Rbz2l6$Q11=VjY51>vCgEr#JFYAWA9S zsS2l*REw*2p`fCzsWx~+D{)mL0EvhQ5@A>e-9gQ`ba-g#i!R{83X8Pw9{+Ui;*vnR zBZ_CrCj|Z!{li@|CjY#J^Oj-66*6P#Izyde;MVW8a4Ec9OWasI__hLqtC#Kot33{* zq%Y>y3tdzdco$H;qWL(@z-g)h=Fa`=6Zk!wqCJT~8lLd~sE**uC}}h9uFkKX-Q9b3 zJiAYM%YcR1`WWb(`d1rax#*+{L6eKXZlIU%ZQpwQc#oSIr~o6tfC>r#5Ey|)nGZnW zq+XRLDU&r%rS0xwy1YMMKX>`^NB8f(&W{c$Ni8K_tY;!tIRAJ_7A43YZn%rI6f3K7 z&#wnqmbShU&PA@0A`h$Q3Rnu}9DM8Tx2DIB#|IB?=9!Q}=}%?)j!%B_lmEN_vK;n% zE~ZadlzLQZ;rjZ?>#x10+_^1`?m_C7CY&lnu5$IvOXJn^=V!Yg`tFaM$2~G6 zLG`0BC1p)e1Zx!$NQs2&T(12*;T(%^;yP~(HrcDgD&4CR7|h=k;I zik{RCNJPUh5G4`DT44s}nkeNlK_V6@bLGmzFm89dakEJ|9}bf+D-)O!)>1N2&V#m0 z+oq&PjWJ7|rcx_Lq>pg388_P?@O1rGCsAZf^YlUgg6q6VflU3aAAWLvBbMh2KCO-AcRi?1MAm-dc)Gey#9KQ!Kw z!cT9MNwR0IHLPg~B1A&UDJ4=5aF&^fN@;CbBByg@P42Q*|6lyrRQQXXx;ZTL_PXmq zyR4-Q;p)m2#csYD2GxP0-tx29@Rg5c=5) zE~p>0Sk^2cT3^82UP_CHEjp}S1d$}lZkz2i?un%c0u96V;_UL--PLoO^ZRK$W56m> zr4=6;tXjp-Bk`~cNH;fF0D+&s+&s5?a`U7NX;TUdAQCZiMnn)!I9FjVgqov>+N;4K zkdYrLr|sp{;r3bBzkKflpLjT3)AT;q=nrpuOJbszRBB@v@2LAY`Ogq3wo>#XVLE1v zP0KoDF}Q5lM<u-MjwGTh{9Lxn27^%lz=Fk52zrB6$;rIXLAKcu( zS89nx;95~2r~GGM{>ryrdu_;x#eHc_R9qypdLW@PZ7;80`sgs6efO)ceEgLMP#=*c zHUbCN6K)NP$CwZ!WgAljR`j|?6{)t9+Hr#pF+FV-J*3?_mzkE-Fcc}=pbB0`ZwXeSEeqOdODY$KMUQ)(mUk$odd<04?8i-P;~K580n zBczC_QHVzuFi?!5l)&UKnURK+5V6!+-Ogd6VH|VLKv-)%+io|*1_a-K|NTUSgq!X5 z?ED-M$IX~1)lw1cn99vK4#Tk7Y|hTkrg;{C?RNY4@#A@(Zg0{!3`A*nc7AbjUYRv_ zs}^D5JWm>2+~3|#^OSQQhjFvnq?9nxFbpZBS_%?9dGrVoh7re1DdYZ7;lNX^fGLqA z6iPIg3IO9s2zAH_F{^#6ESxcUsRIk_r3+0ECz+vs7jl!opN*A%v7DCn6L=q=ZPwRRD0Fp_d;F zU1<`}E#Tp;H+)Mw2VkcZ=td>eww~+LzNoQaM6K3>S_x9#3}@#XAgHBIRQCHR4a51_ z`R;6&hf!Phmr~|Z@-Q6s`&#O5yG=yXJdfk32CT9i@&OL}GV38oLPTe~^UZEsxo)@H zL^MxRRd!Hhnx~vH63+8H&E>E^R1pCg$8j9T#GHnlh^A>SbJ_3rEI^6QcDr#Lg{73b z-|v}uw>#Tx#!~CJ8B@ya>7gP3z~eBo$bLVG_UmC8ay~mh8-_8@vwBGT{eB!q1gIdC zXftjUy-m|J6V0W#QX?nAEpQ#|VYq~0JHa8QI619bm@t87MJ$MJ4En&L(iWn%G!N3E z8$ho}?zWl$0Du5VL_t*6?R1A*L=8VdTdnoWhU0ny?HL;c9&u_~+;`g=3rhJ7DH1Vz zX141izh-zoI04Wj@M6mB3BLXaA-k$F+pWR+Qx4F2NH|IcE zeZ*yUk$A?wy+aJNck4R{Vr+*_{N?%icYN^0_rCOYEm9GxhMfp9g0N%(Aw3hCk$~AJ z2f)h2L?a70?#_0X&y?%y-HRW)dH-AGTN84T`2e1N<{^LLR-QWB0_kM3qsel3i-i+hdzWn8X z_J99x>Z3hc>tuDG(J~0g0_|RtTt1YZJX1cpB`*!TXolOZrYl4`%oM?xb;k=01>$ zE|G$+1OR|kAkECF$^m6N@JNhQ6N;A&SRY38`l~O`PN=a!CJsA))n}8S)+wB>1xw#fK`K0MG%oSm~8P9gR%3MlGL@6bJni7p8ro_T{n4_tyW&ViFX~;Pd z0uuq5BuOGfOo{+fPEZ+ziAd`teap#^FcTsw4M1F30J0GQpm2c^xH42t;6Vh?ynbq# zHj;>PN+^{G2onqNRFj`=?Am}S(KwKZ%$12Eg{VcCBPJ7DyV(fi{n@&r^v7!mBPO&Y zfTl0d6HJALh=wswb5SaqQ7EOHQ{fpdt!K@}0D1OofYT+5L2 zcC!(HVH|X?Yg;eoIt;_*#lqYBCQ@|90nrFiJ0+U{o1d8_09KQ z{q$cs+~6dT0YrEpK=wd7f*_VMr<@RpG`ZfGBM1PK(y%?hobEl#`zH@x`HpvP9+mkP zs0i0azDPG#@jA?<>wsM>74Jshr_%9GgdNvkUtHhtwC(NQBzwWd=YHqkegBXB=*!>x z7v8_!$HuD6QW;oM%Hk~x1%R0=^O*7%{@@S4@caKh4@o>j!gjl~%`9w?ng!3Vp1*qG z!^5!o)F(dh@-su3o)AFw@Q1i8`KyJjqUO42R3z9SSdfL{dcoo&XlD+_8;e(*BSxQv zpaTGvwX^P=eufERLdpQCqTF!VbIDk@83w9^HEFti^yzlu!RHx-z0HBCPDBjX2^Q%E zzIQwE#?D8zy@ZAbF^F825IaXy9nJ6KCnrKC1MyH7G2Wyl7afhg5lr^5mAplt>A zh@}=0W~qomDIKN>5r@rYy1gCpP|7?VCQVM~%7^{_b{Is2Qj*HkG%+)m%B5yXgm}B( z&vO~a5dd!C763}s_8_b$9wLB-fl|r{a5x-ltwYYttf44EDV0k><~q-{GHQ0G3SbpU zIitW~E<>hT7?G3BG9pw>;NzJ~Wk9L|Vgxj)+fXV`vk(9a17Tt2$|(^7)mpX2vDV5p z$`6dfS9xc^BnXgLpj06M%>!e=QjLn$3^EW+Y=UX7h#;WHqW7IMTek&k-Q4MMW!^zE z^R;iVUKarxjbV0fh&OaVM4&{PTaF?Gn24Aw*IEkeo~qTz+QZ>ML^P$8lftf?h*?Ul zb16Aj7OpH=B&RGWlquIFFo+1wP>Kjh<-%M5pq8qqX^3c1g$a7jxt3B((Iha%;AjUP zQ_6{EgRexCQzFDnR1rm(2((5*gpmxs6Cx1hoHccv0Sn3 z+k?qb8Uix2Ci)S8aAjdrOzW<{{*;c~I!;sh_MBG737rn!HAfVi?q0SeIF&_%cil%? zE84}F?+P9EZ@s#peU~E5s0+of($3s1Kdu;Ey-T-bJ^!_wGzjm!e}?_m19JAY3~lll zb=RYbGXgMh6%ZKmc)mNkcXsdj?bWksb1sy*LKQ2)T4i%L845$?u*xGmtzvVt*@(b2 zO`FX|M85pxFTeTLTaVsxBRzK=dn^EKDv*-40gf*uhBZ!W?X=D_ey#B1`s*wcZ9XKtZW?BIsU5*}TKo4skQ zk!c%OW(WyMX?*P?DwJy>q75Xt<~d6pQXOPY#DuH~-Tjtve*)ceb%g@1%mNa5ff#tc zw$<4gjn%@1Ad;*pg5Jop@jO6*-Nxpiw{*P_Nkr|00aAOai!ZuYkTKuDD<&-HNF&(k!p2=k-LDJKyqwWu4tzrE#J1?lGc z`gXtHj$NvTQ<5r+R=*%?wvx6BB$nzc zgkWYB0fj)b=7C7bDzWTR*JQenL=WTwJBV5l7`O<Nb@1g zB#Hk4X4XV%EugvPELsOTO%tMEO3by)6&R6>?(_xyYS%eW}nkE(F zQtLPjWh(PD*TT$DOWp7H08mP;Wv;byt^56+5LslJrg0qgAakw8IP4G8JQ1b+{xD5b zEfs{zTyFP!1WJUrx3`EiO;ai)c_`DYwXur%n3;tuS7G+BUWD-7G`NuxFNz8-5q-kZ zfswYc0mldEnUubIY)PS^AQn169C5b}Qoie3eFInZp{(6&4w492-l?4F zZZO!Joi242mgY!T5yO1=qrFQgpa|r+!ki>T02JmbP$;L(`Pt<&yL-=XFP~4FGazEY zB3j}a3Z*@pJi6f(*&WifaieCy2urOM5&z^r{K-7e-}61+^W`sn>6d@yS3dmetDpGz z$GO&j{Ez>uzw%dq;(z~N{%>D<{jIkT)AgKcN>zjfGXf(d1V+e&DWz#HLX{|?cRgUeSwx_|uU^&4Nv!cqlV%W{wVAWGj*4h#dtdLHLvY5t=xmDZ<3 zS0@N(ybJ7{;J_AA-g0&(MyrF49Yt}88{U3G*V4uRZ6O`lsbjZN|hsaUG1oxdcO z<_v^>umOZgbKnhxK-S~{6AT%X?#G=LkQJU19|oB!PlchBf(V$bvp_6Qzf`ezdng)J zmRdZ8?Fe9ujt`4|4NI3cHmLRF!X|f-f~AyFlxPb|t^E}s5ipXJ_ zR1QliWoAlLYCTNTG>()~nWlt9i9n!~A|gb%-|tgO^E`_c{RyQs&oeWpl;&FIS`yK; z-`7%7N-1gH9v~qhmAOvS!CGz#mm-K*0ZLa4qEx|Lq$qXBSSt`FMk!SYiR|z#93%U`9y#1|mwDrL7DRfe4CVLJ=d+5vq_jlk?z( zhHSvoY6$`f*ulpU`QnNf&dT+hzM)9e=UHBP03t~Ofcl4 zDd!$c+RKbkL@Emd(BW`kk$IYR0C^aMxs)ORS`7GPno>$2a=6{6Y{${&l*-{Cr2>F( z1?I!;E!H{=LuJDv8mHDe1^~Ia0TAI@>pb&3Bhr4quSIiE_P0m?P)eESxs<{M0c4sc zBATaZJ{)Q(`%<-=@C0zk2>@!frW$$#DiM`hxKt?xxRwgHN-!fTb_Brbz*9Of^Wgx8 z!z2Ku6acBUTG3M#@N@?EfqY8sAO-iV#I+84nP>EYc7aw5MQ-3tOLIgdyEId+$JgUD zV+wn-VnY#WaDm%FNqxiKBOr1z46@YWi;h!wUb)0fYtz=1>8x^|8hN%T5bp-IEX3=p z6l1^ic@)Py*70b2_=Vo~@kEwbM^+gFCmmF}3s&lSw!Xl;c%xMeP5|%(gBXZhi_f#| zdRtrd#fP-L*j_$3yZ7Ao>bbnV0Lm;_L{#j&^T*L-xyQE3&tF_Af`ql!oQJdR`C&Tz z-~Q|W`ePsc=nwwT5B>fh{J}5%(l7nz|L`9krm2+jlRx>B-~R(YlydqD-~I7-pX?8R z^3CbG);w?#L>z#`eR#>l48WWyd%tsw`k;0?0ziSB^X}rR9&Y#L_WrBiGu_^lhu`V7vdNqx^ z?|${ASD)R^`^UtU(0XbkGD)R`2v8UtYlA{xZfOc(@1U#Zv6JHxp=QcQX_c2B8l^0D zkbv!1PnJVZ>jTXeSA0c;VEOCzfeiq&k`hEjcn-pqCxEl<{dsqBe?J|rZx5U8S*E0E zYF!3?uuV=yuIH&`do%<9mY`-uDX?;VAU0j>6`K(8$|Vu&#M{x;-8Y-wM8Z4_loBA| zJni@Ud7eQ8yhc<|ZfRi$DY^p@6U?NI)3Jg&X_M(Qd_d zjBYgTB*EO)Gf`s8tdgd01+BA}xa|cb?^}ofNEwW=0BdOIsR*8nW2g(ecuGosFhhsB zK)T~G><$3h-9XtjKi)>ijv(_~OPS4ov;;=s(w&12m6_+trQ`6?DNjU5lxnR4LX=uA z2TDqbkVK%CDq2oh>%Po$&H`;tbUM75wh5#%Pk_AN*NLX4LD6VH5h*A)*E4Cm+Nxg{ zhI)H*lZ+l?L;#773Fv$PB7%{2ATw7dwh;&^k={RSB$2f_m5@C{DjXf@(1Z&BJON#r zH2bkAo^0a%TG?!_h#dvN5Vg~WWz4ji(6Uw7ba@S6$?q*SS=oK-sMNyEOLP_V%&~8O zGLE*;=*yl9=J&y!*Sq3de0?z#To(VYNTX$N&|{}Z;W>Xq?D5qAR)DNMt7{qBG~;Tr zbQsccZ>MhGV4`7{bvZ%HHgmBNkG$#qyYIG_?N$ae5-@8VkkW9zyL@nV?}gp{7xMO8 zC|AK*0IGnUzu_IU)@$Ep@C2Hq#d>`8D_{M+-}}ACPoCVne_xot_=PXL@ci?)H#dLl zr+(_=AOHAQzxLI)-hAVgS3dBgKlWpr?b+LJzx}g6`!mnI@ZxuW`iF16am@$dgfj~e zFj)@ZK)4z5G*#iMxm>gaKmZE0aM)k&+iJutOsU)%hK zRXRl{zbiRdM}k8HPec+MDveup`8f;p6Z>2Qz#F#^Ql00|{MxU+@!D&D`6qtjqu=+b z?K2N(+~|$UVZOb+dE*=3`26pF_K!aE+fTmrt?iJdR*^9FVkMYO&QQx;#ux*H)yn* zSljDRLn6}7Of}<()+@7E002}ln_zMc2}Mw=>pL*- zDQND$d-M|7ct-=f5Xj5Czuq~v;O5$)>c3)I)Qoe}(OO>My@?PJA?Yj;Igu&u+&JuI z1&G?S8SDV4C_S>YQH}jA&JRFu!2rQ4%fu3(3Q?JSC*00sZWCl-+XLa+1 zAi~;xH#W0Rk&Yvj3K)^DUW6HD1TS@V`W6ssFMra83qct|bRUO4gkUc&RU@rZY6-;+ zA{7g2B5WfcL>THcMH+86I|9PJ$Dm0i3}C!bn`CFK1sH_Hg;)LPK|21ZQc2W28T zn(w_{l&T3g3{auYF%>q+#g3MuHb=&Y$4&&Xm;(TyyP`owcp%9isUmJJsd)6zPMre} z{t4T2ZMEHU`@Z&IFGg!aTP|Hrc5rUyJXnmiQi0`XzJ$jxXhn3LNR2uLp4Qn*9T%{a zq~?-z`T#6Vq75*L?K&(1epzQI7fCS7n~(-OKaU{`&o|`~k{Cutw+V2=`r6niOjB7LxawbNF>i@S$;e zE3JJ*Xd!fK-*}U?q@v4>_q_C+O82wA`h`Dv{cB%)=EWCZdG*z2UwAR^wx!f}-+AZV zH{blm*S`Ar-S-B>ZBFWIx*1T^6AgFtwpc~-c=qfEzGJw0@xj%-PkrQ>d*d|kZwOHk z>=Q`PJX}*Z<~? zx4xBA+HOY;hp{+u=}`c;s3z3HSrKH7tl8eZb|yrG-atH>~|Y3 zu4%6?3k|Ph>u`W>lh$Cw(>~mqth^?_ccV%JEVZbpm{i3fOl}++_m1eDn~cKm29HjQ zcD!r&Fvb#z2zYZl^riyP-Xb)iPd|qFvD-Dr(#B6sl>ztaOr)yz;Ks~*;M=>IV7D9+ zU{0+4zQ{>e)(xGAEO2Nqp1r8+hpi%NwF{2FgoswwU|GQE$B+ngIMinV`V8J6hrLlZ z_VcskV4g-WtpLP{#-80}OVK@XtK$!!&WGLc6Fg}TRTsJWy+v~_rWH&qrri{eQ}z83 zH`p#)g(=$`$zoiAynQ?%?X=czi5+AU`tEIy5?2W88~2ZE+rI5#z~BBCKfAknVRLbX zX)FSj8AJ#Pz3-2HSuH4cEagefdjfU22ivGZ4WCn@lyb_q``fR4<*S#MSNHE<3CrjH z@N>WQnSYxof9L}r{KO|d{_Jzlec%Hh_}W*$_J97r{8#zn`M>&~{QY-odU${XrD0b z_x1zpwCOaYEI@?qBwhf}lY^z<2HRI)Ey7#Bg{9Q06C4@eZAl#K*hdS9=AW(gbURSF zlxhZ8TQ=945GW-|WD>+Hh2ghlEdxrzENOiHL*IS*$|trL_don#^S!TJJbQ*CF#;$; zN<>$_54%nvm=f)FTNeKESHAWezxi9g`fI=Ohkx|>o7DzIx*f8`#ZcY~ac~?65$0OU3?jrD+w?`b*bL8KZO=x$E#=LJx7Ra}u_L5!2f>dn zIZsd1gdja+xhoOz^5Ww1>gu`Yo)hLrPp;p5>&=JnzjsnS6Jo-YwNbRQDdC63pU}{} z*>&tZ$#6Cx5-xl0q!Ur-07?gy7CgVlNnMk8>PaX{36iPTHu^MWI3Na(h`^Bo)8+qm znd1u-(=dw1P>w0*Q$H)88jilA_wI<{HU12J%^q*nKzT%0g~dx4z?m^?)<8XD1&c*< z{R$0Wbqd8^hioo{k9rODuiPcvuYT3Vf7&AgwMMyL!8vr!F|Jta?bX_g1E@RnJm@|S@NW(nJBXF|N~1}hif`@; zj6D6CW18wDFJ&WPLArAQPru>um3{0iBr#~3yKe3ws0O60&~_oB>vH}Eys(31Ez`g@ zB=-B^^dL+sV5xmO$F@a9;YdVnz15QaAO4U3CmPQSq*CLAdF%Ahj3us*xr!xSuoj*B zV*hm3pg~tV1VFSk?_obN%d^kFu-)yLd9&UAxBu-w`Rwm~_V51PpML%I*Z=81`6s{i zTfg<&zw;eQ3LdZ!N zSYQ}7^Wk>BeUhYtB~{Bxe=dm1Zd&|>q6_yz)EykGrJ+sQiOu5;`8x}=x-a&3bA_QV zibOdl$~h$@ghZ5c&Uw(Iih7*BFu+08YL_L<4_^8B)hnOOXZJq%?D_M<{>eLUUO%}8 z1|mBjnpq8iux7AD$^(o3N9~*lXezyE?x!$%NL!pxRvXPM?R;27(3X7R-GmU@Ipj!0 zDP^QYDG?>41el42lryD-lv2vcU{*q}0dH;m^d1^6OoWsGaheNPdG7gVf9MCk|EK=u zU;qBU`00VtyYIgH-oy8%dCocKl-gdhl|TT=35kFRS)f)Ye*D*nFy?eNrXfRNx!%u( z?cf~uI=rMz1QfxCz4x$K6#U~-67=udF6(x`-|r7MH`miNom79Gq!tJm+SWvX$bRcQ z?nc^l7(v`0<-a=plcDMkRN_2!C4_l3t%6f}ivluSUut z=?aJ29SS2}#nzyAW@+M3hs`Lmsr@R4Im|)$FYD zOPYTPu)vQZ(zbDv__d$W_Bgf>w(VE4_$A`uaM1P7Ieq%m-}l+y``!QWAO6F$&prRY z`d|NVKJt-|TtB%^Dc!qw@1>Vsp5}^(H-|@cLPnYaF==-=5QLm4b1H>-u>M10zKT>k z0U8i7B|6*g;K8%CmRjqBk4^7z-M{_iT=&8SkymfgVt2SWx7Fc73+=nq#mqGRY3V35 zX>04{Ot^rmS&v1&2^1lxN?;Rf_zfuw@qEV`gZ zcer5@MRkh$1Xy#_I|ZcFSA*HUi)>oZdJ78x0HZ|nn+SZ_6c+%KRr^TDdM-dmKgZ;@ z{H4y#m3Sg8uoMLR60y2{zl$!Wz%o0{gJ=G(et3>Rn-&R9&QFCVSEEkHiI_Zv8)Cp$ zFCzp@Nx`TEUBk1|>eEJ2iDaDpmOn^JfK-n2%_CSJ*LK!4`e+1MESV zoj5SXLkOtWjL3RoJ3pZZRZ&O#ck>7UC=q?ravTa7S4e_f>L)+(Ndzi${i&b&Tifln zmZDjr(=^@g_lWeuy|bHHrZ=8c7^DCoF(ES&KtdQYfk>I>VaQq(r6-$_8Yl(g>a)V%;xfJSwTu(jgX^mxse9k5%YqC=ybv|tpXROh5s4;DVJ5o2^d5#k z%B4;`iWegihiKC6UZ;T!!l3|rjs*l#?Cge{epMKB@A(hj|Il|0_nyDE8(+Pb@8^Q^ zv>EdD{{6Yk*EiSizW4C`_aB{|?e5>ZJlpM3Mi54n>fQrd;}kt>k9BV#YeW%Q`w}4} zv}5>?ko9T-BH{{woGCfzBi7!A3YRED%Gz8U9cC#_MMQQyY@}Nmq$0yA-c6y)5->)k z-|dK)5CPzJI)K2dANtTIKkEZ(s5r80@FJX<)00CL5F0%p_ zRY-G{!i>)SQ^>NW@N;V-)OEwQQ*l5TPzozb2JTUv<0k<@umg-iph~S^u&7%y)e_0V zo5Tws)oFTITBGW0uI*)9&kQY!!vM7M7>02i z@<@m*RccK{_=ms$Ib%Cw9{kuZa+y^yghVJH(^U4i^X-1Rx#cng3nm(NyUqFeczz~% zD5|p%lFy2SGuEY3qmU8RgF%f)dwyuE zwb8lOh67Eq@#ul*5=5yo-hb{x&wu1EM#7uU;Lv#{G;2$yxDHXaWf1!Bq5Z!)@h35D-bar=zKFgcd zo0#We7=~f9+YLD*fF2+F_~v?lyXRWBo6Y(8`8W*RBm@uBeEs;*{^oYG-JD;XZ?;<^ zqMSse)~XF!nQJZe=KA{P`daxjqJ)HrDCL}UM#O2F4*R{Zq?8dk5hKDp*UD067U0b$ z4@q-h{y&ucX|Qd{bsmVVwK8)L=iGbWRIla{D1ahGfFK|YoD5RY?WRP@Et0ZBjFzo% z+frEWR``$Y|Ndh~I6{B@uS0go4%zPRXj_(AY!Uzg0+cWnfC35x3RS2=4ewRG`Q721 zy>||4`Nzu4z0bL~Ap3#@?z{KgJ!Y=_@>}2fmI~61B|wr|^)84hB}7$)ViHz!b^uI* z+bQbPvId<&W&sdmjM|fOVRzL}R{#t_-x@+-ZKflb3JhCv@v8O~79?q`wFVGT?J~2) z9naoXg<8PGl6ZfHEj1#`lR70Vobv9tZloN$RLrmE~ONv zDW*6DFD%B8A)_3$wo25?@IIyxcUk`nLulcw7W~j+87!;&a&fJYxct0?Tq-h#5;UM@ zV&)7H%qstR&CZ+L4Cxk@q*-N{LD3S96n08jc+n~B;xz(bxvASv(9T#vKe?-d$85Ea zKj)bBaV-YwuCQ}=G1|FKS*$g<|JW~3U+t1f2(`}`RLKGD5=iwd%Y}6&=gOkEJkfFw ze9_Y^SF-m2m+*b@(ldH4Yl#3@YrC#$rbLY-un3I8ECvw>*%%)~h~S(hKp-$`>P%pe zSkq<*6v}Sc~i1CE|>o*>(op)?6MS8Q5Ssh z7Z$Ttszv(?3b&Gy08m)idOob)d2=?fpsw9(E+bCp@}tjPefF=ID^Iw#>-qGlqr=WJ z2T6&wAe~bJ1R(0yt8UeYaoTQ&+qduCHxJhbtAm5}despDFy}%`$V6)<@0G(qB^LyX z%v)203vCJzQszO(XkDN-(IexCj5X>kYmBv6-57`pbylkdEAg5;$d$REo&6SDH-xG^ ziZNCsQ7VA+w>WG^AbRqNC;rj@>_7b<{oxRFjcW+OhbTlT^2Afq_0Ba-+jf2DV?ab}-Py@m@LoMgt+fa1b=!Bk z0aM;Wn7#MZ6N*g37$7)f+pe`uQ(G2VYrXd;0Mjrca$}`y2oXn2qn8NUavK1}SWp*J zOX5hZHG)h4te#FrtjTV6F+pTj2YF^7l*nwY=^E2m0!acW!YQ${RP3u8ClqSirth1`5-qa;#^lS$VX1n^?lcMXmV*1$KZYRCIF0y z6Cn0|Z>?>tYg#9OllMu)5C$Kbra?mEYz!f#6ntpgcD3qt78qkq5JCZF>6eu;5 zEdWp&Lf198WUsUZUga0c8!h^~-JM>A9l~X`$&2Dl9W671b3SgN)4ebOCo?ddshhfj z{M>}y%v9~rRP#sAouy)w-CynSWDC||P95@&$3Z##%+3{Ut}K5mD9by-Duh~)!Ta3X zMFRO{dJz{GZeDYD`VnO;i#a!uv6C^zIoC9;aTbsy0ZH~ew@{xWKyHpz*fjy^UE=_T z%*n#t^J= zx#S1SwxHbGI8B6V0Ei{YU4mALH+^IN%2QXEAG~=SlbEP&*fKkfmVll0AyQ?g+jg~H6Ona>3_9ZwDfrMh3&MuTTDMxQSeTHS zwgCV_aMm_WLxupcX&P&75;4XYGT!@?;%dDLKB6(kS)7QBmPoK5c5T~rT?hdHjJ1M7 zD6PY;0RZMCJ_4f@rV$Y&0b667Q8QRXA^|oaB#2=2eK~7~$;Xt8X@nVavmCL;bdBvC zitd~MQz9Z0Q$mEq!i+Hih?x9Bk|8t>Q$i%8DJ!rI9}R6V|MkqippJfmx-3K6Zd);acGyMZE- zF$Re+1p}fqt~EvwtTpRZPeduDlt@V?PN}udItu_Pgtl#cG{#WdG*a48DB@I}BYN+w zYZ}+Kjdjjh3nI}Ny<;+lIT>Tyu5->38RHxgC1HzbjcJ=EGjc?M%s7r-JOB_;)3kaz zV~jC0j+1b9%xc=kxdsU>8OS(WB8W*2a(-D#;y1hIGL)M6DyW#zQ=yUaL$5+-s+dU| zMApyhM8qspP+w3k$=Z2ax(wjeyDqQUQmj%6EmJ^9j=Um^)FkH1#R6-Vqvr-8_?UYbn zX1(hj#-Ui3l?H2z3(i=&GK!TfRFqU+OdUKT>fE_p?u(g`6ss)4%wr%ST4S1~wbmgS zQG1ngCi9>DFaEJC*87Sx4G{s}e(kkazw~GCefQ;X@4*4UA)!Svwngj28nUkG`hK-K zI9zv)4V%+9Uism}2PaQ`_(M|+WE}vi0^ArQAl90P$HzbW+0TR-0G(@!auDnDS^!?! zsUKLNPE95EjXmhPal766I0@|7XCfNSMa2XthKN84v66?f{-2ihH_o9ko&m_U>qAZ{ z4jYhIK8wRjMb3>jOjuc#OwKqj!16(Gu)jnd*H7ZMU8p-KmdjB}2RB{Yz8msGZy2w4V> zqWTzt$@>_?mCIK?^{G$(hyUSU|J0{`b=|LT-??}D*6kFdQcCqjG=^54u}G2Sbnt;| z&Q#aZTojE9rK2W6H8abJV+bH6151=jw=x!Koa_5OH`y&Zt;tWIy`mAVb0T7hkTApm zfYao?pR^gAF$NH!gNP>t~+pcI18bk!hn3P)pGw0Spm>57XvBaoC zCkQMe6eEa$v&I^7mH;@VgxUBCnT515b5!R8u+|W&)^NXK+2thHo7V|Q5 zOp!SWfcJj#o>M{=&2h&R5pvhd;6q9rqG$E+D*;athV~A?f?BaCPV!H7IQ)fFYC$4b zEmT3j)n%&U;pO&!{=kK>V-B}fVN5eDE4D0kcbzj$IX2JOs5WfPpWazDW-Pc9;w#s( zSBD7a5YpZ^%ik99815W*xtuL>bMw!tSY>e>ECV<1G_YvEc2BXqi+WQ93GCt|Sgvjr zu`GTI01H62o3z36=bc4Mb?M!IsO3(voPAz^xj+$ejceM@HVtIV#t33`9KQ1M5B6Sz zK};bG508&79sTq>-)kQ{e006qY{p^O8je5`kj6+6h(y2-GHxvUE7z_cKJi5R=;Q69 zkN@=Tcls+wk39EmEL7k)jR5fOyYIgC+D{%lcyRgB<Z_IP%WPu@R!`$xy`{FsMh5zn0Vll?o0>w>Mog%sERI6n7DsQZ;n>FHiJ&&0jz z)0$*ZQOHsOP^Q5`J0Oc6=fQ@yJ-qVtN7qk$q`7pxbZsT^6gx2k`M*;>?OxAr1oF@#X4{;KqX0+FC1OPGs& zs6;h1T2n^CjMdFqnHEIOMX0;;kJ%V(+a>|L{q~JN`|?-*XpPmp zvDP2}Q+{ItlwUzzSAV=PA;$y&NyLw1uuviq-h#!lsH5n4iXR_5{PACW5E za_#EX8#iv;y?f{Kl`GdDdE~<%e(~V&P+Py1mI%0rKbaWMM$8%#2vdyXG>zj30$tZN zT}Q5cu#Mk+{rxu{_)RpCQG^7AfdDXygc!B)yLA>46JlcR#ivb>x!!$Byg56$d-v9O zdY`uU&ThPZ=gl9)vpbL`;G~F^cZcAde!gf-UdUt3W2q*W&*#pe%&=T9vqNGn2l~z% z-#xr6c12J+%nC39B%tQt`qgKDarM}9?cue?(8G6M8{d1ila0|za748lKtOFQ+qUld zBab}$%rn;?x$d0hlz;&ZAV^UZ5)dL{j64j(u-%IAYPG&}bm{P5WvwR$j3q-vhEpPAT+>p`D51%scxA5CI=eV`(o*@fvq`P?S12WHWh{@V zWcOnKTIb$ODQ8=t1%HUS84ieW0%=^+cHP2BB=S3C2*@_x);>Vhk}_V~|XW zF~+3U3`FRh1Hi~hZAN2^(==&SoCuRKMpHjpt4O5O2;~Na=&S|An3ASynI%(VfWiC8 zPs~!eK7Gi>5HlxjX$JrRL}-ivr^wn$7y!Upm02=^5Rf3S%xe3RWUoPd5fYJNN->HE zSTfc?HV42;3Wx}>b~+c(mHvRGtBXq}>nvB|#7!ipfsu~(V$dEQc&l@d8 z%+66pFp^@D46T53M@|%NcBwfR7HbVNSCdHwh%v^=OJeJ6+cr{$x=OJ*rI?tRowH5b zmKC=YtrHod6jM#>WLo30eqOq1a z6)c{`C4f|0p<)^FT2Ueb)8waV2q9Q&`@V15))2+S04QYdZ{v4ffA96XlZQ?N526u7 z24IHZ!x(~Vn$B8bj=~_wqNV|m{V@RnAf>q3Ztvf}I~?DG;dr|D_Wd`1cy{M)2pdU0 zZ%lVf2rnL{yKnjfeuCxp_vtQX?XwFxk6+3_bfsUW`742`J141)%@I?-4JiiFU2`6}fMUo1pa#clSFSw$^wUo~{`k7@ zP=u4N$~nVbm{2u@L<(f)*46Mxm90H2x)ZUa{%-gaam#q=zoZ(z6iiiTp z!orCNSA8#lZ~W}7FMsW8U;NWA{^ZAh*$`hj=oskM@n#5`G&NLoVNfHsETBZ$ZRn0& zxogg$2=iYEIOqCjw;!TV{u+4^xp5KU?&VO>12 zm?=z-}WNC=YhF8^{o5x$Vzbgb4DECl9!6w_UQ!q|)*7 z2l~Xde`+S8YUXbz?n`}?^9}z){KFT(mb?H+2UQ_i_ zdlr?EmZVU4x|cv=0?kEQBx@}aCDEj0$(k<}K$LrCi=>Pj)f@{JyswD13DGy7`+|d# zh+4IfcdLY?6t6a?637KnSiH1QEl&!L!MQ9Bbpu%*?QHN=LNzZ|`<;G>b@|KG<2(yX zQ}dErC`zL}I&xl-W#@l!Su(b)4+qd4PUT!svW8GEVm7wV0S_>%N+VnjpyDyUdU+H zpX;^(7tWoFKiS9N`HY3^TC!fX9%A`SthH^|^{cgQS_SPSf}GSKGp7jm-W?H{$hUs_ zMjD3R8k>?cw7PQX;M$|Fz5L2MKX~P%pZNH*zw)uS-~8Fhjd%Oi8n0Y#u3qU654(ed zAO7es8Q}2J<@avhXxq*id-J{bo_y-57hZUt$n@RHdoLoHPl2-Ym6D$>QUyaO04b(v z@{{)h(0ARc>&cLmCbl3-?;{%baERY{^~USBeK4z}OP?VTR62RtI0yuehky};NgSq!~1D?D5rOh-}&*w8?VLfLy4nEyfD+Z`_2{vx87cv3Dwo} zgGR%01kTyv9Xr!<@SWLRM*PBkM9RXfomLT@>y8c{fBxvn7u!pZ+HM`j)04M<6mPxJ z!eohofXGnZSyfYL#@fC{AjKpstAq73Pd)kc6Hi_~IwFLm%^V2`iO>M%5RZT%#Iv)r zaSGO$%a<=-xq9Vbz3y6PEETnt)7+pjCJV7hE9VT6QDlgwn22VoN_!SzK~@hO=4ckuOT)PEB@| zkgEO*SPa^B15GAArCQZXA)x9w&nRvgz6)S0fl!ZMTFNaa$VFkdG6z!Na$f!yWnWSQ zG2}Ig5Y+4iP&0rf528bjOOH@g1x9hY-y2IM=_B>t>axYU)62*yOXbU!_ncW;S!puj zoEOC!ads#TJyJdzO93~TaVkrn-jZn9EtfxUoYTagfTYB^H$&;(Q}Uqzxgkh&NPy*rE4#lORamqo_33hfm`jNSl$THp)(fH`wMCYB z7K%vmd07zJi?kJ#_9^*-c1YJ5A5?A+a48Fy`PnQ3_;Q+jaI)?~oUuF5CD%8Vf0w%c z3mB}OpUclXZ$0%A4E=oc_CaE`IeQ3;F_<$3Q2GqdHwlZw?qR#iX+8d^=dUv!~1vdO+LQ<+G`IU-j69g^X#+FKJ#qbww?Z`@AD3VrL2khIhPm$ zg^x!BU`fL;PU8e3P1Cl0=NhNaab||g>&eS1*|SN$@t5zs`u^6t13|P_^^(FY0c7xA zqNX{lh;T|d4Z+zfvdEbdGx*?-j~|>IKaATG+};oOZrp$SN2hn*O8!hz($KJ^WIqU2 zW7&QpAkR(O<@{^Da7mDP7UtkpOJ{e(#v*TBYQ1-I$pT{9!)s4pdi;g%k!Re|HL}(} zy!+s1KaBU^?#Y|%L?yT*mZ}?LAY<|-7zmM4io)D9?cBuAt3uP}>cvx}2~?b%k0o z15K<2i*rx|$XUr^`n-fzyAQvvtocpVV6p#ZDX$6D7I1-*5VO-}P5>|~p+!y80`q$} z-~HydzWrbS%YXIlm%bN#>{or`S^!AGAdqE1r534FhvxfPx?z9Fk zbjXZ%N+g7`&X>uW^CP8}z8oXl9_9q2R9LbIXL__{2Zj6>FbDW0TeiDq%nkJ}oUO~Z zT*ryb3&6aNE~5PT&^rTyMZBKnJ{h^p+pN9yrlLC5=Hkq=dE(-6?B%^?VsN<{?@MaR zJYTP|2rz221X17)C6$J-NTFo{MG#GeZj0NL1-hO0nDw#q?owAm zWxY$u9`WFC+$@iCempF0ex?r2?ZJc6rE*U zQ-2%AN2insqohj^7>yt~I;A9~yIVj)a+GwB?k?#LM^C9CAdT>+1*8R@^X&C@UhH#z z=iG5!-^;A`Y+|})rf#KNXu_FY108bqUwC57m>`NoX?BN(xrJrCm)aAd#ZuZq6}5d& z9Myt@aGSb%T$)~V?SEhnxs(1mDr&=9W4fljEkx<{pBJX{7oz)t+r6G`OQREXDe_=fKIAIJ?=#sSyfQik&dGdFX0Iy;;195d0GC)uzt)_we!V z(rK~Y%&<-$0VYK(za}9~m*iY^d-ZVw@t#WR-IDU$Ihw6XabLVd%{7b11$hCxFgoZ* z*!WuZRhPN-eCMz%YHDWfi#iTjTp>)T&1EHZZqBXeZ=Mvu1bXy)IypRD?*fADeP1Vk zGZAhdLtjMmnz>Hbb;{YjD@nWx^0jJ5Ts?dy&XeJt@9h|GZ0t3~|4Y4$yy;`e-i!)}AZT!am8W%*xuUV8k z_dVYVI42Vt^889O>u{*grVfp>yx_g-h~RzkjRyghCFSzm*w5KRi*X zxcDrf7?X$3RMo$)nTCeB{qhT-z30t_byk5$1(Z#Gqxb7q&uJp6Sja!RlBDsjkz^kc zR(vapyEl`ZO$i$#suI|X0|n-In|!$Pzv;eL;E`4muld*ar_xysKOL7cB)x;PmBJ!1 z?atq*?3l~RlDaWk;yerDEZ36 zf9o0RvUFzRYF8)z-@{o9{&?+eTl;gxL5uRgVC{!3b%i4+GBX)X^VnLp*-lI`;KU#? zq0r9$HTm9gd{!e#&M*+7v+b~}o_P=7oYyteFkEkR5)MP&525$Bh7v#{2=nq>;H@EN ztsynG0#Q?Tk`LK{|5g$3{QcTalp0K7O?8Yk;KAd?{Uk<}$Qb1TM_5Rg)}MM0l7L*| zu(QcNb7!JgcBrg#kcu6SrT845?f?1K@U(HP6MB+z{6-KAh$Ek?s`1}8=Aon4E)%uH z`6Vw;{WDn8VA~zn9IY6&8zr`paGGTpJ^UCsGVfUI z)>l8ZUOYu^_U%~m>zgaZB^+47j}y}!HF3G^yGu$AH5*ZngFQXQV&a{fF^ep$WC3g-7A+YcKFCy1=wOcaD1 zCqC^Egxr?UM}k-C1rTShp}AHkYEl2`dH9sruU!54)97TpC^!_a6lz^(L3&!zcWPz% zBkG5L@5r&JE3&P^t|FLL)S(Q=?%EoN+^olkLaiYeHW$9dN=05u>935dXn#nEWEM5@ zE4<37qPF9BZjIx)5Tt8ynwjWl%ZGHcqDb^OT|HJyeVb)M;WnNoFz_MUuP8Q?rnmWQ z!<2%_&E=xVS2R9*w1%*7hgPz*c65;kB9AASTQ*30cXi_4ghKT=K1SQh7FEKkuarI_ zH+RKHa?a9cu?$PcO0!gJYW$Ovzdb8rV5+K`Katg~FB=$=pD;BiirxFK{oht2RF*Ei z=a&b!Re^5O`}{-x_WqAXk^guy^*%OJJ6T+RKK*peU+ANciZP5D=aDs9YYpHeof1z7 zs0^45(d2Op?iaZ0{Bh}+$g!MFM^KA_1t>rMeA!!cs;cvRW!FZFvFF2|V&}2+c)E9a zMI=cNH77P=M3Ticdu_ZCx%RBHfl}ToKK#T9NslWa?xq)kGM5;=|NcE6R@-9Q->i8UCjEU9vQGzr#BR@Gaxy-D&D2n%HAD<-|A*G(MWp&`F+ONQNYOAk5?%SD zn#E5dJ9hTrr5Lt8K3!3l&=dl#!(0excu zr@_KF#(Y31P(UkiF*7p=)IV@1c#HbnS5v11#$g{lY5rFy9OdssFEm-@aG78PFBJS$ z;>0>JvN8shCVb_n1`W+9jLWqYO)md$=fs^1YUqQt9pmakn ztK8wIs}4S>@O-Ps+a^k0iN8`$N_r~a>nkL-$hP8?Q2C8{6zOa?3z_8N@Oix4&4%Zqs`r|Vv zYlkYt`KVNh3ha&Qxkd_<37YYd+MaSVk;c@bI80I)dxja(_BphZY&QQ?URiRJ(v!&N zqIUs8Y#h-m^QhJ1ZXR^lhsSn%QHkAGFRv=dRm?wIm*&emek}^r> z!3#UGu$-9f*A-c~6>z9RR5>;deX-5xKO(;1&@5Qc#_^Ptr95#d zM@$;!J1JAjfzvhSaK1C>X8g0E4(N0}(I^N)DR#K_P>Q+_ZXMAV1;04Al@a(ZC8dcE zS5yrs&K9jDL|KY>K1T0RH3v))#Do|OR1q`e9{Laziz&J&y(GMF^^d+;2>-rq6|565 ze|Lc7>Y6aAb=Vmcxah4}N;Fs$3|XI&Pdl)XDJQ&N|TwFp)d&GBfS< zJ^t$)7ok4a6SBRV&he9=qe9PdMgd+a>&jDc^pB^Agv`FnW4Hdlv(q#pmbmN{6&1NHhl!F`O`4z1MIOWZ zsg_km=)XMgfMHq5$EY!$Z3L+t&3{Ughwe5jWT3Z1M5gkw<1xZrMC{l{JtVvwM)sY1 zLM|S=8w%FCH$_HgG+B}vUpuT2*zV#CG`!)Fs>H_h>`C%>EAv2;pTP;Y__-{)l%&iV3I2qO%SscC%aF5* zT$#mUH*_PoIFDr_v2v!q9wOlVH_`BKLQ(R3Mm3YCB1<%8{KI?f%8x=MkPF-Hpqq_B z+m!$;e9fbjD5wr zz@!Ex+k4Dr=&Zs>*MZ?uwMZKH1vU5@B8=pOAzmt>978A)suH>XuZS~WjSeYi9Qe}5sBP`^5~osH?3pZHTdT!3@s}?DT_hXlR>attY1I#h6<)8qIBY)R@6l0paCWVFvLv;3fA` z6&+*@8SLkuyyr>8%5?lrv5_E)LclyqJg`cdW7P1E`{c)uFKf`IFb&>*<7fYfmSpsw z#`lm-rXA49ga4XTnhP$fcllp)=5=2sMXl%FE4QRo)i4tqGyS_EMFz_`QK!72s?zP_ z^vn>guvnDXbDn22sybyJIUfS{%K&u5MYdf*&`Bg^SDSIeqUl`iT{>}}^hlm*+LZpi z7UujI_i!WKC?48!+wt9+5rOnnWKE@i?l)MKrZMp^Kuz^{zkZJdjOPpQKlqn<9al&` z>;oq@6*#$IQXomy>_O_OCB*l1?ZNE6ZvA%s;q)o7{iSR0-P*7*v!XY*=9o`v&TgEm>X;RaDNZX)bzolm4&mA6Z9d3WsrM|3lljB5_WPCG zRExM&O62Kq*h&4To-~!eM{_J5zw%u*Pi`%e(p=Yj??Y}Xo+=jCdsn>a7~UMhTVSI8 z^gZuo7k9o=H(Cq)Y;(C^m=LSTJc2(ToL;icQJ{c8>ss*H;=SI$vuy;N|A{ubFZu+n zQ(h>~#x8r%YHDg&;s!0!y?iO`lA9;bnQLi15Zyu7mfP}Lz!)Sn4wb_%!5R#t|0JE! zclurt2Pp&rT(PKXc?wcIP#l1Xa&6}DWA2A;IopT=;K9{&n8k8V! ztY5?InI&7t0K(`uC1|}vZ40mnKN|{lsyI z2>o09>+5`c$UF;eoV_uw>byaw=r^#A(wrcg^kO^m&G;04Gaum5IM~O4DP+m%;>%A+1*NAq_V4tc%6=CJg>(s=O%CCvSH8%ORC|HOn}A2~ac$f@LrZcy=9?lE z%JLbGW6<&3LNzppMtEC{wk4EkQr_C%tTFDhd9sz*(=hRr1kWq2>(s1Ea#dQGRN|Me z8x;zib(t>lLU%vLsj1e0o5xM`$&K5r9X;r|d8Z=dcrBaKVMWw9!0yRE69kOFY zfk+LG$dKuD6uQ&WyMgk{ZTETWw}*Zqw@BL-F;NK<`r5jt0f}2qFWlBO?$gt~_(n%k zUCVUsW@O#sVVjHBE50-BOPEc^0VYXA+Siw6;oYzS%Kn>gPka40ly3c(yL_%sSL*-~ zDmCQ1KVYk>0zo2Lw!QtFe%4l?=g&~|&+>e|fQd;RF3i{-lQTw-D7H}-_o8p$#P zDXkRIoF5BnQMAjOp{&iC=dbhUO*fdO-}d!f>TeexolfVdKU(xh|Lnc>5g3T((xM zOeSjeQ_PviucW5#|CMy6|8Z6HtN*y%Dm2u-!ok{tB4!SgX*qBTJe*`vy~wx`-q|gNd+jN&N=n6+rVV-)6$o!#nO$ zotFO-*6E>lrrGc!aOpiAC`+D(8US-ccTH^uWLxxxDa>yTHgyF(`Pnxy$L~G7?*2Tk zuAJt*T)&?C7~tz0;ENK$EiB8)dEW}l%F>BX0ncyJ#mLL%`0cy_A{ReTb$BDYQs+_u z^$;VPJ>2PjO;`g=eJBgF{*x9dMpwJ|;8+&di`*vZ5n_w#hykEzdnVf^UO)BqnMaZ= zWk*P?=DwDk!PyoCT~-VZla%&d_-(}r*+)k?F&6;?!q*ya748A`m9OeFmi8vkEx)4L zkY#Ci3ll=>{Ri@*h#e+iN6}W_G&J$yKU+c~)M2@UqpUDQRoSN6KMb;bO9w5L!Dakg z(`Hs?K@06T4LD|>>#)r!2Z#AOV?kSQW*^dR$9sv9Mo_{vKXt3RXKP$6$NF!R9ahR6 zs7Y`kmER6K=;9&jD{M)9r!I8hr)-yN}}LdyZ|3H&k5TYkj;dhK2`0liuboQil&PFe#iyA43s@!%Dah)o!`i zg-O=_d9oTZ1*K%32We!oAWSDZSOkfCVnQ!!6*~L=(sZJ;>8rxte^{wR6+6@A%(BEXLRDg#4^62^BlVNQ zYCr>;!El7bIqnai)tNG8Cpb3mv$V!fkT_nR?#lYZoO05nW7|}1LDbu)e_kQSa|J|$ z>%ifv33*)T_B(kvS-+u4lzhAq={rl{4c?67zPWySe7f;_+C6>yaMZG50U9Vl1|MZB zzU-av^|{|cB4`eoma>{GS0)aDt>UpT`O9}*3pb>g zfP6->?A$gVb*ltYTPK$lVYuarAOsU?-{l+RUOAz(?Y!d0A1^GrU5hr?QSOjaGCT~{ zA!|d4xm9>L=CZZDrqU*y5mZ-;854DCAI=D{w53ImGZis}<;1Yt+D#vryTm_Rdu}-= zXcccA-%{_v)5M1(2VAGz2SI(TU7aLLQ~K9*Mfi27v;X|s=9Kd|?&nq&m3M#*+i{`I zCA%(3)Nqd>(FvDPI6*FS0}xQdz*a1!Bw) zJ`mK1Bz-oaWaxC+Tm2%q{owt>1UNhbiV!1s4(3nrGD7`mdky;P60TJ50a1`{LV0e( zNC3UPEv+I`D?i#;+b1o-7a(aW6hSBj7Xv>IhrG5@DRvpIQmFE9hL<`}o`43M7>ch{ zGiSL!LAS;jG36pST-JqAc(9fPuP@ojN?`4;+~eS0X8q@sRuYwRO2yF1Yx!~)zA_dNREAUg*vf@}Qyr1yWI~wyHvp4N z@h~2SWsQA&S?7eWOxm+s-P`lIn!r+BN7;ou0mh-LzrrdYWR;)yl$Y)=FmEt`Th%te zx~WU5_954weOGmw5xI$luP{E}F@Ir)E^AA@FN^K;cCV+(v1`%?lFQrABpuUhGMoM(r-vVrf)lTlHw;lZkR$cMMl}o{8%KXT#{0Nnb~pUAx&9E>5Ol0+cC)3retQC}+k^X!T%xB#?f|CC6Hvie^uNiH z1#)Ph3a6!z^S=w>lZOl4*T^;hMzISr7&^K%8AG^Bt~K29j|}0GS_9Zt<{ejW&v!^9 z6QdP;|IOY%Mt3x|&uH3_qIr9<6e&SRl?M{}2Vop{#)5zorwK*tA|rCPAS&GEjsFYWi2 zIs4vNx%oe3$(%-#S`krzVhCNJnFM55v%AkUE9|n;h9JSE-UcNRma#-RFSbrqIW5}b zLXk*~@4|MBP$nyGG-{><_UtkNYqWuT&Trnw2d!qezt|-&mc9q?e51^BD(95mudmkk zj69q|>3998U#wZ^N@Oh0vW(9=)D7N~!%rSJpEKC29p5EyImh#)CnV9rH|3J_wZDyz zN-IgBruUlCTdT_0A6LuNi}7SNvfFP|xTsy#`i5vVA4lGs=ACIrU(66ny zYKFh(#^UA-D3CS4Y&B6SN4A@I68(mCS*ERUTF5_7VgzcwCX^5bsJ3!b<^9o zD~7Ymj*WqB6TBr##La=u>G2m$8m0yL>KefYP;8N%;P72GSzKM1E;OFADBvVcEw!EP zw}g($T~cfN*PI;c6=0J5acAJj(#U1GDT}OCgBHD5_FCxiCfI+Ql3`6m0whh8)wY!B zc+1kJ{==0Lwga_-;Jj}g?8X5d(|jp_UXH;k?0PWJ=MA{+UHFP`%fgPc<;y5?S@KYl zA=?(LQ1F~=e?2oV`!{I@1g!Hadx1q5VgIaJUpLjGIu(DA-KH}X2Ga@S-g_VO!cO;H zkDwK7|hs{g21+S;Jrk<|C#E~+%8Xe{B56PmQMcgn&IRVLOv&Rk}HSN z&6KtA3j}KX=gm;qMKylMot8y(pE0~UL;XeJjvRP&@IDkbsQ;h~X>UPJP$5BKXKnOy zV(SHZoVTgCvv9~6rP=)~W&hu~#gG8tBv4A7Z_z()(g**g4Bp)M!+`i05a9XI{f}bE zY2qVl{cgqV;o$w#bjZD1@Xati$=3V6^WT?)Gj2hT?JnEiT0BtR9>@RW66sAph@7sj z|B}SBbNm~brBsZjionS)2a_c=Sram196oBLu<&ETMbM2rBQe{KjTUR~)}r~;gT5=g9~za;e-mUFmjp zxeK@TnXgUkdK~lNTDb~ii!B8Yi>eRv<>yCif};gqYN&}GsvS}DRmaJYkvf{peGT>Y z^mL9V9hbx%D$aSqqPzEsCH}LOiuF`AKtDRXTQk^OZga?kh!U+BpZ15`Bl9f4B;O2c z(6O1+Vn!WgL)i;Ho$D0bIThSa?d1m_a6-={)z(T-vi1u2dngK6mky2`CdkgtZcdPK zb8ypQ&i4&=Q)Pwr4r73u9Pl25Gs4+gy!%S8;)!T* zw#V1e_sKJuNRXCR7gv=!OS4q6h~0L7LI$?41@3J=1kQCRbM9s=frh41NLbnY-J4nY zhiadprDMZ5e``(A3h@(^cfNeqmh0kN;`POfI%*I+%)NGh%m+9PWz8wnr^c`I(lYBIx4dQv<_+)!VF{PGzp zJHmu*@*c&{BtyO}XKQihO5^v^xTqx92)LJco3ETa&x?s2)meYY#LlDwQEep?0L9P2 z&<8a+_>3rJK{@Je)Itv`%9zE(+rB&GrrWZ(_&9m3k`W{&_5V?yS;hw#kZz>qw7KMB zgJk0&W#Da)9ASRarym8Z$0{SR9d$KQkdRaPkGYf>#{YhyO?%&&!_{MiFeqh}I1wZy ze26TvxX^1!#26DkzTf*!+7Uy8_KxKRWBH)%jXGu$HRZ28g5NsC#J!NzhqWy!;3V>t zFc1~`=kdV0SaVWKs%Ygh?Y@|-1u&T&U4aib#}q=8Nrf}nS8uT|18~LYsF06Q(`=K= zvb^drOW4<8f}+oRHwv+N%sRgnXlXo4#l<|;i60sQF+y$mAXo+QjJB9hy z!kpf{k%3SUoZb7C$vM#=NZ_mlaU7PytT~PUfAlj4Mt(w{EpTTRkK67%nMqs zDT-sSG@aAdGH;s@{Aj80{%_cUNU0Y~i~ri24Hh%O8=v@H@w}_89d9q4@<4rMjLfrO9N%&pU`LoMPo*o7ssbfQ3 zOmzw`Xolp$9x_ao0WA4fy>h$YWz`U5-z&S(8T+_mrq0nJnm0G%s% z`VmJj;}qMcoasp-qkl#-mbNjt{}=f%-8<(2OZss$0&!R3m;WPqM}jtJ#Gl1wmQ{l* z$u8=&{Uxn<=Phk?+9yKE2#6Zv4S5(J20J?T7dU#vz>HUxHdst!97j1tdlqT=MkU?{ zC1&;7K()T5o_R6JCmv+2MTqb9XKp9@*mfBnu^B)5?8b%q%iM0!@2Zv!z%cIu)b$>y zsx}PF=L39z5n;(yWLeU%MyOVi@dS74dsRt!dx2-M|_TYNG zc}^=QlNELLcjxHnXv!e)<414rkEJZ1(x-VSUq(9kb9$(1Mx?xD=gyI5xJ;a!z~$-m z;P~*_XPaL~U+Bc%xh@dzfiRu=ISZ)10%^d3{e31ecP=#=2)BGXSzQqs^_Wx+O>KMk zmW}ql%=9XLPD7=e1HfP{s#AK}nqoQ0HZo@G~<0IEeLFY}fF6aUv*4>D}`= zZVs2ZE7OXw*QCJ1eQ66Vv`z>m#7!t&9Y(h62!&@^;X~Nu%6&9I^NBe!+A6pTpszyS zeV}n)-ywLyvq<@x=TOnIwB|>;ar=7c3h!@Gv93rIEfc8FwSJKMjpKjV`LW$fct9hh7&p#prEhfDH@1V7;kbpK z(zcC>tt^z+K^c|-bIh2}{Mi~Iw1SE77B+@nbCXp< zl)nYw5B*(fVuJ0J&(c6H?_hQ-mcE)skldv{^SR3iAXhBwm;K!{;!CXjHc+`|z$1n&Tq%iH^3UQfO2|E5oa zPsP{of#&5OqP?x;=@0KGOkAmJfI(WN8KOUFfbig!gm~wRV1Gt!m1N$j)|_08yI%}0 zg)>r*K#@3%v8XIWHfIEhPLh2*#6DhL|J7$hEpRAlD3(lGF$M*rp#2-C4wvT*7!_bE z!ZnIcE zJ`!%KZ9!d_$6YEwDdEj6CmVnM%x)%s$?Q8_X=81!s2HXGue;nsJJQ29cw6BFbcPd-t@*vpp({Q?~yf4e|kjMv>u|DH_*lh zF>&5mh&yX&oUHfx?L9;jpSWlw3Pnx;HtM3v-^ukvhz?FQyOm`7D{mPl4ZPN$D!IQh zV#5M#BJ9T*LU%(Qe;dJ)L6+tbJa^|aas(fMR`IwWL6~n*0op~#rdmKP@qi^ zU>mWIZ$jWJ0jPYf&=!q%9F*v~wkcm}+>ombU}*ZTQY<5z)ECE!9l+1siSR97_{mQw zw^iyHTZtF{mSIU(fhDdn(+?FySZ^y$7DeB0L&)N)yaeAnYM{AM9F@&{pLEWv#jb@BxOGa2oFY8p*&(#VQm zkf>RXkyLMc$KprI7v3n(``1~CBfkFhvcFScp@{rAUAcqVLnOkwVfVURL)Fyhox6ox zRTWwFNu9Psilru>T~!1X?j*KKq!WX*!2*+(%CT}`savw@%jyFXio;%VVR^I`#jbvE_j)ZoJ&Y`dDaejyb0&rXbb|}1MW%92B zRf}?QYn#)`$iKOQzQ;(Z+c^i?r|tEphtYyhCJ|3-^ba$aiuL^uS1W7x1-+M7ae%$C z|B3!VG32u0@jO*iQW+}Zx^{C`)6hKN2Dq&L|BGaZ?YX3@A`AYC3?u6lc1zCQWEiOh z#dFG|()D6Rf~Ifm_1yIhm9~;Bao<_O=7fplXh%g| z=f1|wQT!8Dx7*URc_U!K@@I&YR4&Uhi$hTa4{}#1D5D0?DR-*H_&j`B#P~*B+(*6T z1HHHDdTX9zjbT#iS9L${kIE&Bj;liI;$QmAE)(D0MMwkRBeFQSTc|ec|1%WVf7NN$ z9sICNK!2A6VT({+Are*(51mX9u${)F9L0%GZeQ8l*%6E|&+88OJrU5Wp8#ZD3)o;b z6J~NGt$;C9r$At{_cyjpk%e@y=l8Ge4$3jrjP=6$Fs~6q(Q~vN8P+Mz zZ{UjmDjd85POqk;{oLMuboc9i`+G=G$=3kGx>C*iiroX)%Ix+kwophrCA6YMoq(Pk zj+Y`&qbaQvuY@wPdd*a?&!vZcnD;}}U9J2l(#O=!G&O=W$;um*pXWjXcuczWPT{Ql z2N_J9MU0YSFGrgW@B0pGy&fD{ap4B98@1KYWf7%W+VM=|V5hu=zEs#x13N;OXp8Qp z&@so>gZn-wIT2CdAg$D={tvHb+75ma)hrIB$XaY78T2cu)FIK$`3{Bel~l@7>dRi? zWfbbK@dFAm1vEGnms5-emajRO+hkp1q%ox}>Q&u@=;u!%HPlxG7cwr?a3^Z^C7KK? zC20Anu^dUZ9PGnSBlSl9SOX`MZ9*!HHovInC9tauT~liGfYX(7!%Ne}%b|GtuZG!7 zqMOz;5=z6N4$0Q1nL6A%f4+D?4?nA?Aw`@Y@; z@RBor1GEh9gZDFo{izj6AP8rX+?MIx)`EXKKymT(y{4h>?n>NE>TE~n>F{a#>1r|f zL4=2n?#o=Mni2)E^oLlzeUjz0{k{ONj7XhVkVZ9=Me)wFatzEPGK+!@kGAevC1Y5 zXjBBP>$>Dx)rUDD(zt_xZgq#tzP%p^wnP)Ej%8tMqirr^0>uVan4z$odYj#afZqug z$>V{{%?I~Kgsc*b&US*VSTaiZaJxFL(3H zxLzqBV7VsBj<72Z*kJfXG2p|%_(_Mpc+i2*u%-!#H&*I|XjnOb_FHW(0x%e+rL?p) z)w>y!@Ubz-;-=c_CRe_DZ1g}ampf#4I>`qX*6DK{atnxC<+X;2`Zu_}qBJ++VuB^K z^6-~tf#1oWDe3yrb*tnzUuV@!UccOjCsz|Y#^6;Bz_I9b#E++ncLT`vD!waoz|Raw zFQy6<)lGE&1EFhWT+|+;0d~DL^=1|2a z)%AA3H+jpEy}iRrl$%+v8oLHJ(Kn{1voO%iMo+Vgc%!fn+-bhGA)&OpW7~_(tryj; zY3_d&kPmkmyGx3vqcpU>Tn-JZ--Wb&@)aY+mtWN$G0>jZ%dSU919cxozVG~e`|(90 z+Q3#4>*76jG%uiGE5E*0t7t%!(Ferq951&?zf0f(r%$;<{?)2@G$0KIb^ z2#HPwhNCl=0dzg<8amlE>88^xb!1IGugdtT&fjL>^U3hx9wG!4S1s&#T`IPZz28Kr zr;VHQAq<^Um6L;TtfXD{{b!J+ca+VGqouXLNQlk} z86AK`c+f`I(f3}LT$j)zhd#bqnG=O0j++Q8IGshmP|Q{PnC=nI{#QZ1WIw7ThcJ-! zY-44jfWRDkSKma#kU~tdD3h*Fkz;>@=&hVrt_~Iym&;wcPyYME@Xh-kwK`r}!j$^#8dtm zMKISuDg%%e88)9#7SkK6=cQTQ#>_FOPcQUo1-|d+0HTLW{dQ!Pztx;DZHdZZSDT!y zjG)rgyQ~BmyM!y0FiLbW0{pDdhb@x3$x~ep2HjcKrw2q~OevP0s1(RHA4#Z?LQ5(f z%uwuwG-ASMoX5=WqqHI<5t?mmf~9ik=FeiWHa3Jjq8?AumXzNz3KOBGtaSlf_JBssDUelFe7qJS`7e zFf!(+4$AX7*inX=bK6@G6s@^Ve^k(5R3KHR72+yNRN{&dQ(&_!1zU~VR0=uH9*DM@ z%0n%%Y`4PSr)ZxFB5>g(s$js^KA)aQ}iOf&@JOlbR;rMbGjhR;C6Vyf|Gw}i# zsiX;MTUzQ>+!ThjN!7(rc^7f9NI8|0}sZS-t;%Kp*eZQbF(8T)~Hson(OL@pLx>d^QKe zaflzcy4QPsFAt>tDL&yQbb9_?4hY(S$8p|qy0&42F)Tbo;}Mo3s7>EyV%B!qNJ>>; z-Nb-J;nF1yqP8sTM25Ya^EBFm&8hI1vaQt}$Jy~2??_r{9V}Uo!9GOuKyWEBi}_fxQd10<-ro5e@qaJj?a)+HD^VzF=^E88HnZWW_MI%=jXcO;;*<<>*Z9ex84C={d& zmC+p*6{`0D6l^u@1s_%9!Ld>eW+C&-*ra(rC?n{9_pYn$LF+F~-@JKaWUN|DG^v#) zf(uLIud~c5vwz2o@2-;D0)bwwsixGsEWX#TAD3LbFiFoF?}AKjK>p#aAtOuff3?&1e;FT0eDw;)j`Lly|L zbkiRS)ig3U;oNeU@t>UjdIYTWY*Ip~ND_pFTA9Cqo7i0vSp`^#IuhKzQg@Oj$b|_~ zQMhxkw8hkY3X3n}%g@VqeC-IEiT-use!fP8L5&Zw7$;%fB?;HI;bhG(&(Jc6vdBWb zi@Qm(?_PBbf*Zw_rojcd$*eGwH-h5dotH_Y+D1CW-rAtChLXpgP>%agH3Cyo8Ld zQBn%Y6^#V{CANyM-os3CIFDcm<790ehC#v{RXF6@L7%Ig=-3yID$=^OG#Gz~+RUdJ zun#JX|$< zIZ|yXWw8d+^Fz$5&sx&1SlXA-Uq3P1;H@rb>}g*|M&MGo)eKZ)Idqu3ZRC3{p8+ak zz-bPDiByc#uEV}9l?YKP&Cu6BP5ib94>k#HS;Z~;MMn8<@yX1LV9I;*bdN7E-?!R& zAce{V^T4JyfB3YsfLqF}<+H%5&tpoBRiOXN3+ys&S1~!gb(!G!3xBRcc%T!{d7eP* zT0>VZjU*5KI|}SEjdHLB1m+u+1;__gwz(3SxI65>n$&8S{vtcT4p8jGN*|G%Ax&Ro z6VnuQjo!S&XglkR2@|@o`A;X@mH2<9Wf&h-2^nBWxaT zrJnjfJsg_Rw+){@O!r@kJYKEyBOEX1_|!q22$n@3T_Z=xtFj}Cy}w*jBs$O_EfP}L zI}p`pX+lO}q|u6)*N^TRu70Y2XSNbF(U7yWq=BzUs9cf5r$SDC45B%~_>$dP+~(`g zGOto3Nw6>LEG%BER{o96PG!+}r%kvm>e_Bs!Ct{m+|KSdI(Pqg6#VPu#m8431e{=t zn$%2BtY;wp4HCd2Qu~6GfBrIP#TRMF6!_77{&ID5kTG0lq}+vAzb042wQcoanHk6L zbj@YuBxbaL3~et505bqS$*gZlkSHF&s`Amj@X~%|nhItTvU5<9XwvO{>)v`$Hw`2p zRj%$~mVSvWZ|ahE^z*=EVUbd|v&#jxo9+vKhpJACf}kv*9H6QLS7Tb@WWS=s?$)xt|^% z4_~=#WvMv zN@DUyU;r9j)^Bzy^PFlPNGhu|(cKYirS>-ld~w1)_;B+a7&pV{0Ls1~LkV%?K#eH+ z!X#HJWFMRp55eX0Z}8P&0%$fn|I8T$GD@0U4>F8>f9QvIif;tBFH==k3D`{qy`$@iG`7HFd{t8TpHif0Fn%Nq-2w(lnA^#T$`)fupN>)TWqb~?&THZp33mJ& z|5_*ba+7z?I)$sF6+eLZ^>I(f@9}0>$4Ay(y`eN)o0xw;?sWj?o1u{AgxH<`uzw<#mY#+h-KoWQx5=Tm#kwA-1sEre6AJ8OIJIOyMwEnJC7fIrJfO|u1nL# zJV&ch(765VjF)u%PWP|Z(&sFamGZX|{|7-F;^0K1ejfYY1C2%p@vNXa?is*8I@>7$#D1NKb*tf9A=PSPgGSOH=`sjCrY9K~K%9kF!@*Ux$% z4M??BAW`=5t;lcW?JK}E%+ayx)X0h(BUQMLdD4(O8oE5zHXpvT*_HH`$CguiRqw=^ z1(ZaP=agWx3&1(@U(z=af6+hG>v!zx^U-+jAuGT4fn@^y+oNu(Q6wGZ=2jZGgkG5V zv^V4lnSkTxmX{BYa=_=boyPy(Bs?n04Xcb|8{;hKf%7SD2KNTvD!M)TnfZ_VMhDbb z*R^J3>%=d28v1EWxO!!~CU`vrEcmPnY7G7Q`kKi#+U1W7yYxycz)I7mW-p*ae#%0~ z;IU&GG%VW36XzS|Ad1Fp#razDD-Z9>U0N}xgox0rVAalF7@gZ`gw(SPF)#%cWI~br z3F7q*o<0@0X~M+1YOHLhdPT$$E{kGT;nyk~RroC~DEy@=d`n6?S$;_&)@nk@?g27I>3tU#rWa zgRH)O2DnhAAC=l%_TX_t2mCp6Dq`)qTqJ0P4$Hv{Ez(+Kyew$RCXk-7>Ulb;bOFbdDhaP+3qiRzk>~tINHMT76X= zN`(aif}=dTLj*hydR(pu*a0t+r}=YTV1R1{M)9-2v%st;K{ft^9JJZY^l#l_gd{iix# zNo^!s5{rw^m#bJn#^pm;0z^Ha9j2+t?NMygG?Vv!nlxbL!tk1HE8kO@56e5Q`@1~m z0YHjlJ3!$8a61gvwx9p}?|k;tpZV_hzWaqQeBpcFd1)Lr|M!3Ke|zcM-#k7!yZPRG zAO7%%|G_`_2Os~$CsqfCDW#NRwVKF_A)#K4E?2@RG-sa69nPG9>d`2dtuj@D0<|k0 zE+!$AgcqU^As8ZOZQnMBhyC>shbc_sv>mp?Fm1N}Y}jtM9-=^CiUNWXRcs_tl8;H* z_LNxETQDk)^(jo^r!-Az8j>I4wAnnob8_ch2pb|X7LCFdi=<|-s9XmjfPevj()bTF z)~k{i03!3r*(nP@Y0RUKTwkwOe)1r+YI|t0vCR`NJ{f`^#|hC~Iy!3F_VVS+-uqi; zxB9++^2sMRo6Sj#z|ywv=;+Gf(dyvnplKT-;pAfo2GJS^NJ-0?=jti|)DkCfZJUyu zo}6yaHj@v|y2JIl>pDXeg$cD*oj_kLl^v2S=GY=GK&{BlLs38g8LAYuZX47?(mBV% zckkT3`Sv?8q{knB?9!!!)xpZOl-s&V%9Ly^=ULAA#FRKDBoZ!mk>w#U z2q7A4jj=3XoFjn7IaZG%BK3FBq^fo9uxa$6Mq>%VPm=(&>ilF(Zqo}O%t>Us*?1pT zt5w&w#yK(sE_+lOYen3qIEXJm{KxE zeU+i>du^87wk@g0K}x{~b@EjB$T2o;+jYG$rtf7t3<5w1NxM4`5|MRQtu*{JDcRPx z?W*ssb4etG5WG(zB@s)AgfVgOAq9^BUEjH;2_X`ZL5djjrj|i+`Ss4qM?{Tv#+bxn ziG7SHLWW#tjX`GdQ(yt-T+=k_Dyv#605n9d@3L$GNF!tjL5r9h=eo94pE;sN#H)ds zW&p?_8PaJ;)`$oT+mfr*S{mJx8$&U~#yahy%_-FtRP(n)1~Dzj+&Klatk0Zh|Lzkg zbOp>s0gGj>mXAQ`A+1YQ%>gkmWDf^i{w>YXBV(St1Y^BIfra(@oH3EIl9bt9LLkfkHcuJ{q^7YjbHubC%^x_@BZ<>`8Th;@Qm*&DFTS;(5)M1 zI!jk95#fhV9^AR{)|)rp`PtcUW{ho}0}vJ_9WmJxCy#w1s@e^}oR`!!4iPuQ@Uyqx zdT{^#v(G+%coeT*zSj5cs$U-*91)p=gF{^mV~p$dx@%elJX{?j;_1UYuY`pG9h^a~%k zdi|<%Mvy_RIu<(v-b>ZbKD?4^(o*iteDdJl-COTHxc%Po@x3vOoN~j;e1K}6TJ|@E zS_N(E2DRsF@j61nEO}*+(g0hphpbU`i?xq#Ib)i>*Y!Y+ z8_v$og7?lk1T;!QI4jJ~HPbj5ORA4KI5_CLu4!8|>P9UwctD({DTSzJp2pdO_D~zw zXf2!8h_!9YBHnut&>o1^T7@2M(;(v6+1c6ISz@-%tyU{-4x{4g#H{x#MWz#DBx?>1 z)_vDEZ4)QobzMqn3LXH7h=m(ygZERMD!0@)*S0O{#UOBE%SNKW01Jl@G+Cyw zHN_NS=-SRTPOVeD_k$S#VB8KVMr*B~rlx87^~w+-QGc*bF@~6p>|=~%sOvgEP5Lwh zAf?oGUB6m2ZOhEcWrs;gEJ!I0!0662h=4W)pC(VG50cucIA@tPiwB%0CP2|@LDWCd zatdQ@@Scbo*8m71HO?u0OGL><5wOlB;S?fsQu?a)Sknhpt8n$sc(JBqRYR3ox}(0T zvbF_*lK+tAL?34VqUu+PprUr*87C}+GiCXryl2u0^07VCxVV>#DX6;47fKgP22{>}xI!O+xwLPI{}xKgeEk=&al1v4 zQV@0d)&8S_`r2xWtlA0JgCbgu3&I>z(s`)Wz$qpl)SMu9rc&j|qFcy3x=U5TjODS^ ziD1#C)tf;C?Ex~36OsMgum8p`{_@A(dh4ynAA9Vv$DU9pl_8E9G@QFT#cVW-)QhUI zvKbY26*C5e88_vFaGj{?$)s#nnRZ<5RgiU4L1fg3m4uj_MRulZ8#Oy-29-DjAIA`b z57Txy+nf#F8zKM+ei9LDECMnoPKg0Q5+MRIiU5!^;7E|u`|rK`-Iu=kgYW;~!NUiZ zsBIcRVot?%A`gIk)1(a6tn}0&qRa5ZhsP%;ue|&2&F5cu;WMB9tnHd4sqfahIQ891 z*STRka7ycg6*IT3ef03k)vK2p=R}gm90Tab>Eyxj;;6a9vceoPs?K0JZ%ee5x`$OYuKFv6 zY5LjE-hSitpPrtcKK;zopZ(0Iu3mpc_upCuQWBfXnK_4p>}AR67j%23;?A5Yfv3Rs=O+U+Qi&64X30`$>Dkph=SO3UE8#rI3{NdIqTY{>H2=P zUL_?VtQm)4oP66fkQfn-G3(VzEw8LK>Vw+0tue+=Ud_5VCS#3aW^3(gy(UEOy>=sr z)6_K0YPE9C>75#zn-*bE>F3lPzVz%0(8lx*V!6Ckv08)MAg2O`?9F#4c|_|7@9);PQBdk}~r zK-+3sj*vt+adOrn01-{48>1TCs=c2Rr=1fU=VAykMWwY^*h1#gG=&;c)FnK@oMPTz zI2An`!y*wxDRwO_Nhy_Vf_4HW*BW)+G1dTpb51EYM0D0-F}U|WX9mcSYntE#Gdt%( zh>%zqk{;0JG+*1ahyd0SVq*vGgp!(k=}ZxkR1D#YLb)UkV1I32 z2&d{wxuZCd+V@0eGtn9tqe}4cbRombxi>(#73bIGPji%_&u?922t~=s)%W( zsEZ>M&7foJ^~W`(+5VNSiJa8hfN2)@5QB|JB6ep6qP@ z+0F;5)XeOeSO?Ccl0`=>?zCgd9|a4XoAhc`eTtEc(XDf54L8pFkYZF>C2+;GS!yWt zc~!N(WEUzdWd~*Fp?{al8ma7Kw%f63+F$ymzsk&;&8Fgm!adar0*11-&e_p2=dx^2 zbfoGYB5wvM@0m!dha2SfpD-JcMtO85Bu6kgP!>0%1uBMCJ8BpuMk|fM0n2na_Osuibd}oo|2p+u#1? zH*eg0k0Ci*=#7F{b%+?kd7>bqMqZ>$hLaJ%yZ7#$o}Hu=KK}7fT)A|W3>{s1vayYi zDTFXh6N+?gvpVRUql1IK>sla5%m$2r`t6Bp+`8|FVZsRoL1Mae^@^6bCzd#c;Dgtu zZ)Cc*ca5zXC)YRxSHq=Rx6fhg+}33$DPBvi>c#+}ibnwe4U#d#cKhyIZ@>MspK%IL zKl9A5{noEvyLOEXCQgZy&IKyNvygyX!$aPjX%QETaFXQ1G#o#;d++@lcW&K0Ier+z z2q40e3fD#Xa8xK(oscNm_m1a%tVnKchKOi#bJr5Z41h4_I*BSUBoc&TDp6ZoVFKYI z?8^vLbxw##Xspp@y-m}E5UerQT29GWi%2n~7&jq$6f|fMF)}lA3_$INgh?2gkti`w)1)2iQn6UI##mzz5!D325U_TM&YZEj zBeG zL;`qK<)@f}4}_F#iZKnt005j)Oc99MwpHy{3Ne~M#)zmyMguN`h$M~>QcBu~Q3o?K zhZxT`8$d9|a!i~O8>8?-B?kzQ)cIW`rO1-dV5%Y{+|M=Sl|`Far&MeFL?lIyUK8Vz zl5Pf>V*&yOwfHxQQw%wEfQUf^0XcDE?KLQg(=d#pC4?!36j_o6JDtH{@@m77f=@Ap z7@c#H*oT0If@_4CQzGw?C~>kx2$+ixiWeF)OY!5#(@#|MQ1eo=SX}cal2b*Mt=1r1 zNeV!fQO-2>vJX!Ern;riEQP>K9aZTqL)KGcwn|#4f9f^Xg-(ll6qZN@TOgTqsp}+X znqk4u&kK1`aPv$}72~`Q{#x!iadH21CT;;Yc0k6i=t4?e+LCkHLv=G%R!N!4u*l-S zcdt!ZlwG!Eu}KC2hU^cud$Z-%N^|RM!n&kx7N+PGS(aq(a;rXPY?t78S4qCOPbis- zS*Eg6qh1bOk&IqlcKDF_lIrR7=4?@LWsD*$DLd{)=d2;qwM}v+gqTX@Efj+RT}$#N z0~f1a@srF`q-G5>Lr|8G3?~5vgAY)ougkYvzsvV1Q2DA_w=nO6ihicNlG#}m07~U^ zJ|fm!5S9d?l*?T_q(Y@|xu1d)AXiTyK`EvHtAoaph+*M_zKOB-frFob*;q9+VuN6f zv1AZgIOUcj!i6zQK>f$Aef;CU^6}sMz2E!hH@@-Jum1T@-*_Vi-?S|nllOzVHWTKs zg4v3=%sgNz`D2SAhVQ=oy|>T}Q@5=9tpB9mnk;0>+rG>zbyu)_`zKi8+CY_I)ENy_*05 zi1mK|y%NhZ(06EU$*dJ2oo&wEe(SAw-+J2sKKuN$&wu#&D_5=nLiRV1GN%hk4FXW= zbwyogcrHXhNhwTz+MYbTclXwfd$(?!9v^!}68RX~QvqutV?nYa)I@%se{(R^Kj3+z zEOiR7FbXf_4*7q8=px!!V>6opV0MX`D2Z2$CzIWl}TW5-M3lTZ4z( zZ%1NGS}n~f%FItIf)Om$*2_R&@dhty)yo=|V_zZd%KBHz*$RbKNU&UJT=1I|99B+O z7@j>vP)+h77RFZ>CIR>OvtPsoO`yFxz);MFe zPeqK;d!MxXyW}plNo(~r|6OayOWqW)Qfjyy5QwH!q$;6mE?`6VT0!Tl%=K!^>}Q^8 zbJh|y*s4K2U6FW5MzuY zY^||GoT4Gj=tIBto1g!sU;5>)?GWYg@ZjK}w-$>y2>^;s|Nf*f zC6^Au?0uO0G>svKh=|Tv=PV*>SF>zmD2rFH`;E+|i|60H_8gkI_nqH~C>wHma`N_D zZ{56c!w`Mwg%3Udp%>N%YcK*CapuR5d1Jzh&6mdX+*FqU^X@%N)Asc2`2K^tx9;9~ z|LpX58aCSZO}G|sLrnnylwQ@@O*c5~mmvNG_T~L#FEa z00bn&m_ihVuw-<-1OXOClMB|gFWXQhhKq!bHHL^HYeQl|#I|X=rXeDqB8wPf2uV2q zRBr=)A;4HW{+PXmHNGU0+ zx9WQl@iD~2DMfAQRp*72L0nS~TC}LIIZA>gI(U`+7S?{k*g9*R5hSIvH5ln5W=?=; zjRBU(DW(_`8$@RvS;HX6l1(urD-4N3Wj zv?a@JVU7Jbb0Ks3Z9#ivd{t-qQuDPai_<+n0fMMs?2?W;SCltTvqF&Uu}39RU!=;q z2+b_f08~YHjrTi$jfD=JkDT8a?nHI?fG^y|09Dboa}7EA&q>L>(*xvQIWzfH53)%A z?LDq4IJuC)%BhPocoytmNn-6ij^(#fTPwm0bQZtG*M9tyJcNt8fxe~OB$-Gfrm>cc zflRG?t;&&kYcONi84=GFURZ~02_0GR4yD&Y1yOsbJpY7h4FK-_b{;&7$!JH#p%2+Ca2q9QQ&N;1P zs_Fz`HN}zQIm|@lth@K%!Asx%_7}hO#aDjt!_8*Xwym|6q2Qv@9lBN_6pbKc^re+> z(XYDh*MH+T{?6a|{imOK+FIkBqe9NrB_B$JTRv(;Vip$mKKNnu-m|bZu4!5_m|_qS zXPvRdFd9kWGnTNpx3!X4FR|}BQ{M&@?ngwIE)tQ4#}D3q}beE682%Luudi{AR z<-K1m^Hz2G)R9&k*XuhwzsT&I;{$)2KU0?7#pg?ut2@iZejIkvQm|aS_cZBCtEZC7 z*#TQpk3P?@WrTt%ikh9b^V68AzTL;LJn1q=x!3?K*5z_HGe(5jOaJ^Ekq|JQ?sDFHNqvQdedaoKGqi&eP^buI=Iu|V zyIDY6*Ton^P)P(?-2)3D8bb&Kl9*G8bfT96gk-IAc5`<6{qKGMkN>+re(BraJvlvf zjdRXHQJxWM>P=Sy2HjSIXhqMJOGh93;c6dHYlRk6BP?d#9v!s=Qkej)D~bp}7A24|RzU9G zzxUP~Z`{6hYrR^%_~M73dG48RwGzlyoTxi`kTUB~?fc6?fMZIWRPiI662};Z;q3JE z{{8!RZ$7+#=j`+}1fPAZOCxRs&>@8g3#^1?(Jc23Ad=?QeJ76W>R5iOjcN z{_$78^C~qf$nuUXL|8<|Jbh|-*denEn2-WU%igQ}egS5yG$ZN3Wal^wlA!R%B7m4c zNYp26!A9#KCxk*^muZ{z6IkS!sA3n&(~owu7>nKAGMWi%EsDr|otW+L%Loz?6NetG7^}i%x7Rf2BQwG&6fae&n11&+-(DN506g=zGskTOb3GtfPj-Z_Buy zr^~$E*h{p`F%a{Z%AGtiJ*s6E%UN8yAQbus7CY-gw895`?QORf>zv-xj0OOJOL8SA z#PgV1{z-m$d%=8}wYYd#2vrr)+$&+8WL)I83j5D*+ZJ!6E-|}9ae2c1zp6{yE*)?I zFOqxp?EHLYkrsjQ!av{p%+AFuS(1xz)y03l`_FwMBa=hBmwJ)+RegzjN8WkPiz}JA zu|jj~B_;Rny@IC-p=Mpw?#K3SWN+l;G%oG{slC(faegc;**XBL%4rceb{}tk5nO-- zS2L*^ZbblJ`^jr_EI<{d)IGOQpDU1l{ zsc}~216IzprYROXjD@GjJcM@UIW8lJp1Gu8u_BLoC6xS|x|_tpag^+jQk1Oz0Q1%( zLpDvdLFPXY5Ri&T3TDrYN|uy2g3EMdc5>&$963q?0Ba4Q03_|>QcD#$C8$d*0ss(! zb#55OS6=zypMT{m-~8q`Z{NCWjIoWIw~}S?W)_Lj8GQPwr+)R5pZwgfefFat`RL){ zfp%h9#4cO}j(WTKyjr|HO=@tR1fX?I)ictG-f=Wf%bhXgl<}RDp0w00U>gP>>XY zABXM9@x9ykZ@>TW{=MyR7E});T(3u8H02a*nYx(q`f{D9T3xQVX>T$whHfdvP=^8z zF_LlL`u?k5`PN@zv#PAYJfrvMeau_$3>0?fyiT{>{&xtFh4r}DLF?a&6g0M={bnUB z)a)3rmWq^H+l#Y1;H+*tmNfDLw}C9JZZ7zmffvoQ8)XJ7@GN)DbvwU&+ggcAQ0Ib{Ie=;~xI95zuGUz{Z~!bz5igjY^J$|G zTAu3$>E}P>`8fHle_(QIpMCm(FFk1mSXexe>+{B4#$ujT7v0GIN?bP$wPbu=U!hVk zJLB!#V!V5)fcp%}{!Q+TgmZU#{-5Pyb|FX|YB^k}j|9y7fb&nX-f2bd=SJpYlI{>) zJAk0jJm(VyOEj}QTK)4KhT_~CfdwD7JdV`F?k?Z92f}Kjj^*RsOXq#i!>^!afwpIC zCo>TR=UJ%p3|tws0J&~)akFJ>e2!Psof#Jndw$@$_~aXT{k7L;keDCoIliHeUm`>; zktUUQ0Ah^MPd>(!IEg^g!x!#xnJX{JtDHp5P^-SmN}Mh~TmTj=EKhg8Xm83cq63ve z5B>kSdR9ND!CFi6>IkNpOINIvAB|L~DpkC{M;_KEC?)S+@MXTExe!+*uUs*u7y@%5 zLSyu*z!DlF68rY;=Al}@ulG{u4KB4WSa&VuPZl$$ zWZw!znU5q~UVT|A3Jpb2&12@BH6Y1MQ|;UfmY8w@$G2Pz5O!|`U=fJ+zVOD*cTcRo4a z=bVU>diMEQz4nvWAVWDUdp}i8EFl?UX&|76OQ;TqM%#`V08sy`5TmwyC{C%tS2!dzKZEkrq;;TE0U)b^W;NVt`N=BmFfR z!sx^8_uqT#t+&Quxc0~+&p!X$qmMn}8V3LiJxUF61#^IU{6s|nd4LIkq!d#O}7TRR7-Zm&epPAl|=*3z(JtYpuzV54fWbWM6h(<_G?Eb~-N_(q+0$-`yhl zwUdFCy!Dg4pvP#WZ0cM*hDii=fE}SKi z$SHB67`04EyIBNn2NNTw#8T|HNevdOxHJzQwQ$NlA&^}eOHMAY|3xC5AKvmUmUIok zEcU3A80)y9qG71?aY3{*qO30|f5*9yS9cGTDT*SN#y=&}(*KvTKkK$6JI(_^Gu!Ux+$kb5A~G`)nTgEAKmY{6K`l`OMN+D@N~>Gd zU90M$)W1;=HS|MOJxR5?B~c|-*CHW`BtQ@(0py%9-1!Xddz;mR4cq+O8<2Fln7DE7 zIey&tw&AnSh7GILz=fKQ&<7q$K|-D@>G@w6^&uKx*duG(_BX!qjSoNi@E`vd|HU8v z@Bi-q|A+s_(>LDuo!|Kf-}|-iKY8;hBDUJNRks7Ww4HGPfT#x5nv;2MdPZVvj0o#- zH4dZpnRy>c+9tQ8_mE(^gd9VHV^ah?ouW!afuj)#VZWa~`{IkwKK^*S-M;nKTfgz^ zKX~%?Tf?eAA0_4K-E35J3YtweXn=w+FtF4HZEo{^yScr5_59^mpPj#YzS&$)^Q^<# zwNe`e5SmM4Ql^7cR;nvYlsLyZoJlDm9!tYnOn*^ufdEDHD4SIo24NlBCR&EfDZSN! zf@?1)s;nQAjYb@)aI?iJ@&qHg(ZG%u1}+`~(W#$h6$=O$(?iShR86MqrK5T{ zo`O8l4$)?1=a(O*TGZG}zh$@JIegWj_(>q4`@WQlcF}j>XGVzv6sGmLCmAOa2Pk!f zWN+(0FL~rUE)Kn^$182ER-@mf$=))kG*QpI#bTAr1*7|z4(lBuVPrKUtfc(Ey`_glYCl8n;*Njdbaat;T9mKH}yR*o7p$@pE`x8?AHu@V5GO&2Z z!~uAzK>FSc4(_r|uR(0fJiBi+bV{ZJ8DpvQ?i*ELqtp5q;o&++>JtAYKbZ*&chea! zS(50%-a|9~G&Yc~I|UOvpm{mY)-;x}MP!_>+x9`AKS zAsuKgKEC)zX0O62iXW(r1o$_9`B$wqDut~WNzgltebLZ-phy}mYJswT0hKanFH0&N(OcEULIdaG!MIS(uKs^u9QFFqaHTku0D;rP!YdSWvieo9C)LnjZO~+ER$9 zkU4APB*0=Y5hS59fWXzoB^7$`;7og_A_TarT)~X!_p?Zw>pa!{)VMXGVHis(L{>?c zc!$18*-++0eu6>f{{(ylc6Zr9bm|$sfZOf%`4^vm_UR|{T%SFA`-2ZZeDd^3DXIxN zn=3Y0>=?1Wwboe9+Db1XBCXDKzuDbfU0uF9fARd)`B&TPtJZ4ero}BHlFzvExfbA_ z+C)eY2vGYX!JtD(tqv#=Kw(=ZM3*k38p#+SD@_m(VAeyj1?IWZIR5(|{q?{6gMVMv zC#|=O^_viv&mL;K+>`qv?Hy4d9HV})yYdcGTvky+Zo!PBlC-Kvxt^Vpi3B%+Q3-1I zz`cmi(xME2$ke~ZI8N6|D@#iI2+N>f3;b9oCu#GIE40WW9h-t?te**FDhkQe zlKavBxED%m5DU8qblnh9GB3eA1vMb)Zj(lO5ZNQ^xFp6vf3cp~J2Z(o33AvKET>(E z%pff&f#htW9^~LbmsypC4f&-B#I))EiA(yQoD+O4{qwqP;D6T7GM{z-UETZC_ePs{ zlccXpv>lRy0FZg3J6~r#+SpODUZGG?%T0dZdTXuLmcze;x}pV|jBp9NGd>`(4&Q0_ zY+OA{L_u)(o%hyegyRuCmuCA{iJ$iI;aj{w*t&i7QCWPi7%!LT(amq*lLJ)2d5pCpdYs}n;^rW3K z3`gU@was&>^QpFOjr9~8);v2*!s$B60>V8KFrd7B>vjpQZILDek)sPab~ zyp^vaEj2YpI`oD%AJ*sNwEBtH06s6+b2K)#H+VAfw>kxO;HWHrB2AZs5LYw+L#^{% zTWg?)wpL+cEP6bKj#qa+O?SQ33L+04o(Vv$GXTUmD>(#z@uZ|J?(D+=425W1 zjl(biq9E(1MPmOVxggOn2;DSGco%2TeRd)ObJdb8?@A0N5^ip8zWD63ufF_JgrB|r z=KEiN|Iy>e<2ZsIrtCl;3=k26PLGk$vnCAE5H$5(+dS84zqz@%I)8rg^7+-}`R(n^ zR3~V5L6C^ddi)W+fhkBMr-iKCxQngy{o`Kej-E!wPWi~fRVr%(Y;20nTO04)^}B>}(!;lf4kxFw{X%j+OAMA2a)r;nI|hSH$N(~g$xx<)KZ zphB&?2RDC`zcFb6A@>t~=d0Ie>vXaEU}*b_%UufQC8V7EyLrU^^5Qjtr#)ifZK`=j1ZFZO$#F~RZgwMk@6Q3N6dycbx$fb% zUxS41zIXtt4&K?{AIo`Pw}GYL9gp67Cvp9|f4!Hq3#JVcG(qc=1m_?6O_H6)i8{ni zr<)<_5%6%p^w@(y3SA)xoaH*CuQ0RbE+G@!wgTz7q>~M?+4r%1o+SY{$&yPo5h62~ z?&@&GRN8{;b;0if9Y!MOVXRaug64(vcfPRaT9&X9eY#r?`$S~;U;fws_4j}OAAR!4 zCugT;zx7+cwcTwIiBr8~4B1$!LT|eU=WnVo^GvN39h_ClP)Z%gd79>VZaG5AGG!i_ zx^?%Jc6$mSh}5IpwA+%mPk9bqVd_rJ322J}bIfa2;7$?+0S~^)cLt!JG_ZiWX@KeC z=xz|}P9J70U}-S@us=<&m%(~P+K%9B3;yN;nCYl9)!Tq!{T=33{eP20`Q#rdlj z7cZY*U%uLHH+7zBt2ME1j#dm`88ATdilr=`aUhWZka|hNpgGM`+d5lmGdeR9Zdd>S z8AJQsecR7mtNYER|1i$SC9l=)5pK!TiOMKsR4v&NCy?~-XzQ&cuBag6JU-_~L7#uvh5I!~bP4or_8%}`aj za+5^@JG)bopf9YA*!$Bw3&9>&L+@sSeh=x(y6;`=VQ1V!@k20dUJqjTVQ%X~qs^80 zH-J9{`!z)8kald19vG|1wGhopI#XWKr`noT(;BzKxdV9|aeOe=53EiT+(P89@Q8DP zXH%Qq~MS*D8){@NcjUF7b4{t}oN*y}YJ!`IeqVZf>iNfZkerLqW=z|eyOzC+m_{ADBWWAp*daz(uG;?aM)}&|MGwPm+!v& z9w1UF!Xn6}6qW{dmN-Elb?Vg+=m^LYT>uCS4W&V4=0>eW-tg#X(Bn>Pjkz)y2Z=;f zbc2*CuG*z)Vh$zy!RSXI%R@JIOx*Ufcm)I4@;P#PVBkfa>c!78VV<`Z@ z8|0nOu~ehwW1VVoi-2(t(9M=Tq>~qf0}>IJfw^(5b#6#h2w4P~i-jp(zLwmQ@g{zf zo!_+iQD$yU=DE#tt+feDDZ{Ghfb_&0g3Z(+j|vPicqS;b5s_5V7J=ycl_wA2C>NvYVKU(EFPuttu z>+`FN^NUwsTwT7}ZMSuzVpN{b~BmhF(?)JKYeXz)Z-*MUoL9&5H3aUbN(?MT<7^|QPckOg+B#(OWkLL1| z5Qqt_+nIiVK(-@ zEL-SjhHCvLF`^NW#F2Fu?W1ivx1?h|1lj0$3lzZelIWXu0H;juEOCi(tG?S9D$=df z(&@f7cXw}A4x_vp(Cr@I3yJdASx`-jp!tAs3SR1fAbCw@Ffz8UMOSxkCV$;8U6a@R zSmc-K%|n!s(mTMwz=(dZZ-}@2Ix1T$(nLi#F?4#rCJC_rAv^r5xp}45EjD1z@$S; zTdfR;r6341>u6Kd8m4@<{4zkXFK3q8TAk}W*V-5biHKIiP$;WLRFz==c+!!3EoCe$ z0NBZ3;u#H75JE(v*4pK(mtTDT`Nhlg)oS?g!>@nsy?0N~&I%cL^61&|pyxUy;$9IE z)~qFnwAxyo_uK33&Bevb7w50Oy1u%c_PcqWSakL`r`zq557F;Bb>3kg&)|b6BHDJj zuqk%rDYhsvHt_@t_ep{X>7z%Y2nSG4bV5c#!tHh!_4FcuK9bXf+*LhMt(}SXL?wb{ zz`MPWpf`09c@a9Bz;u|Lf>--=_B5S(H8v#EH7Q?g^D`OUxkdHAcz1&XmmtslP9ykm zlVj2oA4<2EB-KHuibfDWDUJ#ZZQo51GADcn5Rk;z9xR%Md>ay9Eq#+Af2qA3v=%M) z&f%T7!lMTj%T~k)0>OnU+rzuL*1o4k7)qBtFNyIuuzR=&AHkrNzBNkO9A5SnIv5rj zImN>?ZUkn*f@E=8nvirCcaTkDkHQU!U$Wzs``N6Fd6ySl+!Eb`buwiV2w8tQm?zxD z?=|g;hj+DJrdeN z2g|S!En9@FfX1D7wH)4l`|Y3q?B^eT@ZmhqNN{s={Re;WZyugK{Qj^0>R1K_My_4O0WFcOOb-hPV6jSMND9)OFoOUB732X6 zv^F9X37M4W6HJtU&Tun;mP(SwWtJR=$nHtvh792oA_9ALG*&-3YWd?^37*^a{qJ>k z0MhI3MVM3K!y|>1Wm~vt=?x{J_a3o8L?bCt>YdK+tNR^?7AHmrBkGOT$GZ%H7{7=B zLTcQ-ywru({7nEM1RoJ(B_^qH)Br^|{KFyx@D!`t9Ir_7A@3HHQ8wS0X_%Dw?OzhS zS-1PZ-WYD+&92tp0NJ9(mIW*XAg|qN%&k?wBSb`NV``1rPWsci!T?GVG6E8n?sO1! zBAs-4A>=_kS_cQzp=YpsXL>-t6^WoC0Pm7w(Qr-#dimEqL{S%;MMRnt9sar+SY1^X z9qa;mjB3VMhhKAeW!qRSjf%Cn_veuP(zt$^0L@WT`dt_V>f$0fWHQ)9XuFAUh$JZB za>qtNYyEO4DGOtj?jf4!4nDe^K@pGUVVxj)@pxJE#B`|%GwwCqonc4;=OQs0*9mkL zK}|0)?YE;wUfiB{=HI=X^gvhuWca85^q+qE$tT zzTfZG>-EXm>1@ZusxsTS_r(8;fJdt4b)0(u6qX8=TPtKkvq~vPWi4%-=Q_`Gv)1&5 zCf!ZUd%$N8)BPTR*0Xvsc1rX26V0OF)p!y6k_9d3hAc$ZAlHE+=IGY95j5v*n}!~tathKO31?$QypdJzDHWtv*8tmg>=h;T*YRT8uV;ikhE^r%@u zhC)LbNZ-rA>`vD6SiNRtk;V?1>aH$zr2HiKc0P{_^FQUwmWVuur!)lgNUA zQV94;F4rw)F~-1xS(&7=-6 z6iZ`HBm@@oQjHsGTOgM3AB5z>Yt=ttzZirN2?+>u@rT4cX4=PA7r_gUa~*@97?p*8M+3IXvH=)77@668t6@7s`MnCwonoZVy4eYM6rdr~ zV}Y?2d0q%nu{SP`5_EInhALP#37!gk0|{+7y!goYuCq}jfgr+K2Te#Z%TPC3a}G$z zjpy18=4v&TQnc@;PO~smvCoPK3zJt@=SmEqqUR$(qKMoK2Co+&HaCNsMrF}b09SO@ zF+gj24rNHVCdSn2km(VJc@J(+^w~x9;A&2=0{~E4@G>eYWgx^R+;reKGxkUZy!wR! zpcFq>ppP{%W%MFB8^XzrOBr-Ui0u3)bsu?BL*$&U+J%2YJcc`#V+qE{>UPQZ?u`Np}!xer3V<9ONRM`HhGgm&4W#*l`D!;1o>%3h9}gAUKmn z=@IU|kam&zm4#XDC1{73KYiMC*9es1(W5useDke~%Ztm)>ssqy|JC38=tn=kcy;mY z+1vl(U;K+lkKXua|L=cx_TaQNuC+1aN~JuwYFg>RFFtp z3>Alf2yo-pTC3*e3Y9XHKHoJ(e*QRUGkQ#g!Z~>}8bm~~l*?W?owWyc`~9nzFTVQn zi|x(k!Gp8!eD6DNz5Ukl$+1dI=8MG`(gc3I8J&%fN9M-!G|#(fx4FGMzj*ch`tsGy z^~G+tZGP%+wE4!oUGn^{6NZ}4T((z5eFn4Kwk>Q0Q~@S>P>s0r3du~s;|T^>g+Wmx&(nX z`}%4t%(9)D_%KgIEJ#BsN>J(LNs2NDEZk}f>d!bHM9@Q^{lP73Jq$=#Sp3A&6!S%P z)|ZxuM1Z`%S-kKE0Z2^AmUQkXWv4VaJ+v9%^5r4%S3d$FQu_BPKlU7&E`#w?cDvfC&$3`GGDA@RVqHV+X5 z5C$034cj@#wUM4ZDpq@`UsU3haly6-ePJAi)q1THYN+VjU>t|WJk9e+gORnu%Kgmq zEFjpB8Ho(#6eORO0RVbXFP4&yUe0YK8Y3ZrNNX)k=1%dg*i0Xgg+mNzW!G7Dw*f3X zPEgwz#`@qZJmGNg@h(FiRb&bcmsfBB4$E{f1f+Lp=R37Gkk#)8!Is_uowR^-SD4-q zO&eY-vAB8n%UVUyO?RJ5mtS0#sr7IOI>QpeD*0~2&>O-a4Ez25g0Q@Fc%aIu^`b%S0!bGT$P$}a$mQre|%B}?bKD1@wxRI2xi}21__wLx19AMgp*on^T z#oPLKNOZ|13xysv*1ilu9=uz&!n zKvlm;lUD0~ySu%{<+!g2a2_K+YnRdX1fF|DMI zbrmH&&Xdq*WB5+#@ZHXJfq6Plf4e~XWKCN{iaH`d06bZ*9-giNksBj|P!WLwKr{#= zB8@}w*?~>)z@bnf5|$BRYVCI4cJa&rh&YVnpgswp zwgw{J7K=r@0tqdhXXhbGYb}Tpbv0Q9RjdO<3>~fgpiaksjX#*999eg zh{`aG<2Vpf<2DW>3%Aw)?2Ae%W|EB25KCzxiZCHoo?FV{*;e;LvPG48M@5-M_Z0fV z)_QE0eUFlb#tgmaM=3W0^+W@bun-9XGBXijAz@+5 zSu+fvx4|Mr=r@TLEwo02BE-PK%dXbz_3;q_3}wJV$_i+6H4+WOKvd>=DrGeg?Wc(w zGqL~|8=xav50kbX85;r;Qj>;=M8$GFTC9nHXv2mC1e#W*bdJ^~DqD~w1j$Vtr0sG9 z*jXizpbsPwGnmo8lM!)|NN~g}@p`B0oPGiDgqky3Vz#jJRriGH8P7R2g`KXr^St29 zSItacFgAUEgBxf|;88}A<2Ok8$mdwg_rvp+%TL^o( zPt>r)iET^-;)c4UFE_ZHD0l)%+uwibLv2!apmTU}Th2Io@_6o?pCr zae4l7b9=qtZ)=@foAshPEz1kzFi^CWD966r7Bf0(_2(7<@<3TFe3(e^k~#CnIVE9g z?EGDHmgbEM-+(^%GMq91f)EOhM5}@#AcX*g22w_kv@jij5Lig@APX}$L@b2kKt$M@ zb+E8#b{o~>As`SE0ax~pMHmZ0!OAr5b)*{W!>UOg#&H}6bv8K9jT-|9pq?}S7$?=h&GdL1AKv~mOm9^<%qGRD=jDn1ZFqIx+}8}5@xCpB+;fqB+cqEgFdKMJ zlgy#l2|M5?M{_~&xkN?yEKtuW6-}}9P@=yNBKmX_d{LlaV$N$}b_s>51 z=mP*4hLLNtt^=pEmuc3h=ZLxm<7-;8;=V>iI-XQvRw<2HI}I)4ke+lY6k@E8Rkeq( ziA^|LZdm8Y9djuG;gnD}KxkGh5v|rN=;%E5^B~@JTkMmyGrU^PpY=unh$R#6H*^9s ziM25~IrAH9jf6<0l%iC5Q+E@C7-K7xPwUPirN^vpaxp%Q&%*V^2g&btQ|<)OqLUWJdAYh|Y{d2r(NqfXw#1hf2~fv-~rGfV--Y<9h@ z%{n8@T8l{~3_hZdv5ZO{L%z3a|j$2nN=uAE^n>wF(jlH?CzUL^ulQ z!JUnH(u1P`kqSryt&|dIO+?TR1wtB%dc_w3h?H%2Sr8*Lq(4K3I5GkHe|KH~HcuOrHAUB?+mZ4|| zjM9*;Hp_fXQ?0cCw#KcsX`ZmrewuW+i`F+V3v<=ld@sEPL||ratdW3-VAHZfucY=6 zS`SVIm0dR^67k%!cu6^Aduz zR@+=ar{S~)0JT+^u`w`+b_j{cJl6);YSlhv7VyNhQgo(N3>gj@no=GCz)A_lTm-U@ zo(ZgWz(@gf80QQrE|=&KTIG))yol}?4kR|e*^gXVBs34fko&B-xR=a(qQfO~!8R=) z3!EKZFk5PkBZUVJp`2v$03`f-cDj%k;2_=DNufJW*EQ*v{zxP)I(6+I^NkqLe+AQi zV-=28N8kO<_ntg`%B}s;AN|q)^gsT8UcI^)SF0cX$-n>cU;G#V{?YIM{^K{^V3t}d z14l;Xl>)*#=C`3FAcA%ka!a_>YwaC*k5`k%&2pvpKNZsPB zk%$T%caZ?XLg zu>>R}A}YuOx7up+vUO+W0&cikI2C6Bn5{$q28S4ZCeuPT`-Su&TWdGh*Ds#GxHx}> zAdeqEe)i6@$B!Sc)+?)xwr(a}4n*vytf0h5H2n{YFfg||P1AOFb9H_3^78z})#c00 z?d?2GwW%j)+J)y+!~1QiAQM==)1`$n>J-oDi3H}pN4-Qevta9`nu4~kq0&kROURHy zw3yb50lr1p60+oPvkM?%WdP|iC9>g zwAS=_5TUUEG=QcB1j9IRv$`#aUT8&Ku{hrCtQ-{HMSR0ZrKDg zjXaI8e<7BOIS$}KV}wHCeN%pfL)i6Q(=-i35fNdTrack0+U7bV(zM?LKp9G{b)M%o zS0vIFWYC%_*0LuCkXnUEYot8GB|zHQAY5Bhva8mb=ZP~5w5q!%RSFgF9f?9nXzpjV ztTNUF5ll`HTWf(BqAFaARhfm`EC$jsTR3 zv-FFV?3g+7U=|h^2kj%#)7cdCdSPWh6vWS8iwv6G!$BfXkCpJc3vowyn5;|;t|xPP zcUXT<@<86{oj#ruqmus`SMYL2Ib4~pM)AVZ4_IIjr6Os`qIyAJ?^YreZ4Xvph{0Q^ z0kUBCt*396p%f~A_NRaP&5u5sru{gSd795JF24Nos~`T+AAk7ahaY|P5ztWU+;2Z% z1$Me9)WbF35qfK2wwoKX7Jq1MR%4#$nVXtM!DKlWG)ji4iz0=^FS+2#Kc4E3b9>j_ z)&{)@I-u^V(oJBj`auz*N;Dz}bL8E~!5QY;a$!NDg_#5=+yHf?wy*{+p|IxdXrQ5B zsaPAgrlbIP_j?ea(8CDZ7123bi=vR_@`Z%EA+rFb)_QY!`QrJPmlx-y3~#>q=CgO+ ze(>ip$)dppm2?Q#;9<~GPV zU%{YhmBB*M$!}?K=#w#qG4-bCFOYZ%C%PI zfLjBtML-m8mPx5xb)9Q#AWh*TCLjv}jk!Wo^V6V#(`+d)K0pGX_z3{?G4rXTz zb%p(8PFcdp3}|@PD}hYXw7yKM19frDbvjp6d8R_aQz+{kJaFS?{Gv}B@s(dbg2@zc zYq>B&<0F8`(=L3A%fynG%8ac4GXn_SJnfnco+c)K$3-+sw-eHsMTCs4hEfUwiD*5q zgoFg6(wQ^r`=LP|cf6?Ou-Qzyfx4&K4E>C`#glcm2|^M56@8~2GHrR86b8q09u`<1 z)W75gM##SMU?051D8$w8q3;<23_cYr=A5GsQWO->veP%8zWHDNm;Z!Y6NHP)%U}D! zul?|ke|U9$^+$jF$J_1p@#81E{r2gbPpFVIJtp>^8%kS_S;s8QVrjtIeqZ#U9U^73 zn*SJiny!)v$whh8fgs*Z7$@j(umSypcWE=_H${2h&IH{3M$5cq+Zjni%M18kC(T%B z&f+kLs2}tnA_e;b4k$9LECW#?W@(MNM*mj&Ca2bjhy(cg8c{g-Twf*DWerYrPSgJC z;_}6d=U0~(t1^7;ov*$9&a(#(9t`84LWCZCSpS`io&iI4@{5g#Vy;}LY1-{J7gw)d zUcP*BeR;mw-0b&z5pG;XKv?q|S`^j84D8x&6QP_nB^&oDL7)L3v4Y*059DU2tF-0v zw4g&Z)@E|s-X)~2TWfrg*su^0Kp`6->C|LGZ~*QoNi0GzAjE==5SWogSejsBD@BY$Cj#dg3L@=^0dMy8YF{Ttu}NA2fL`4+K{p@*0a0mxi21)7KmFnfAj8n=QZB9)u>dZf_SNLSW(I?|6yA_jrKX^A`WPh5bxz=U{XD~+ziQg>OT8(JofIFJ45$OX}RD_l0 zsZoZq=w(AA5z)y?mGM9o08pz{{~Q|X2>H6dh$z_oA0XRITQjf+A8~avFOfAj-Q!|r zv=+8QaE7J>_Nms=4LJOE>mlIj;N%|eJ%LAz=T6fEBsI@EnRm#x9IV6P>zWrYF`NuZ z6`zViEWL-Q!PooL{OK?br4;sbkTPRluc(7JqoUkd2{wys)mHpi zNhe4xAGa_e%L%+5h`OMQbCyO+9w?+_${qR+idTO@)^f2UvJZ?x>|Wnqj6n~E=Gdsc#hkk%I#z9Fgdv znJDeH+l$NdSI=MUwwt5%(T89E`de?md2)6(jM^H*k(mI4DLzlYIRO1)R-&4P>)dLc z=H2G{^7`V%)y0de%k%Bc%{1+6tEj0l@n|--15w1=0-YKW%~k{8(#m@$r&y_*u~Yrr zmsIfX$$QZeBcLf;%l#{JrpCG(%|5fi=~*`quAfd!MQt^!H$X%IZi44G+ZPx6VI15I zI0#=B)JQMn*TA&+Q<(7h#9FgGJ_VNrfQ8AGPXwpNo4M{Qdz}s{1`+ggwGwk8UM2`0 z=y&5KJ#i(_Y7=b8-fTf+CrB(@4r;lvEw9@?j@&xyp6t5x_8BKaynFBr1-v`Gpu-Cy4dNaym7nWal&w_UWx0~-yG_l`lW?@8;hj{&UUwZH&3sd*p zc<^Qjv=DQMG_wdb zCS=Go&vLWC>J&86O?~5t!Is&QwncO7f|*-No~JHtTtRS4;@&*=1?*Vsg=QGdg6RyS$h$~l@jsE^D28ct}WR2?#j|m1x;^i4K5UoznPLGfNoB#U%wcqdm z`sY9U$$$9CFpj_fkN?qTyZy62`?LLS|ItSuzWMYio53|8e82`p5R;2h+&u{*YU-Yu zixOI;jKd&At!XW0>s5sMJRQ_%OHrbN61s{&v4d{M+Xvx}LmRi9ZlXvM#_|wUC;KUN zfk`I=OZ6}Z-K*!wNfN8*Aya&#xJo&BVlK#s(+BRd&-gHC0T4u>f(1(zYz=DVE>u?b zYQQ5U8{9o4?$^)^^LD$vJb(4-<%`{RcXD#_!3Q5cefsp|^q2-yTbFX%P^as}HJZR0 zOW2Y&%x#|b+w0Bs`PJpC%Zu}ytMl#6b*;6w#@w2)Y0?l_ zGlW4^2mRy)_dz$rde|mfMA=KdJjsCZ-Mz|KXE=mLMS-VRI;xmCA_yY{B7m2-yXQCi zVH8bXi1UnDDje2eXbM2}U`e`KnH@rCFo4q7!xz={bYiOM&`KiFl6eS;KfO9s{f0$OqkpgbCtmRGdk*q_*lCspC$wO{Lh>L@IyeLz4${pC z7Zq$m^LX4hO#CQGvKR~iz{ZS$j!hxrAY~EsWLGlxEsG#LY-B%*Dn+djL0bX?uz=t$ zQ;?oiYYY0|E>l(S%{l-{=s6!)=e5Ea*EQ@A0(x4->uBs@AfX|0`{oE#q=U0q&%`tc_pfBcJ|{mlpe z@OS^=vv=MRI~=fwx?z=~1vv~t>anxaX z1p{_}<3No=Z37zXAQ4P8%ua@J^0IafLDatDF2b&(9d`6bbB z%_@cBK&li;f>CUUlyF;*JyJzt%uu#;@oM~AbA`|)p8Ml9kj5x=r4Hg{1n6c@p1L}ZXwjeAQ<5WW3dyPE+E z-SeIFm>CZMN|ek2-6uL zcgcmjucy_J*S(Uy#{ZK?j3zxX&*>>R0JWhu3fP6;IXU|uK@>zNSXyhXwo-~sO$Det zixEPo<7fdPiW&nU#nM>|LNu(Tm1O7L0IX;s|8=n)K_Er(tkYMaO9{f~eG31LfU(8h z55U3?EIyPbN8sXb;LO>bKlTPV|9oI95g8Ku(FMTgP?+;Rz$=7M>kNn=e)!=xzxAy; z&;Q%M{Fguc;SYc9```cWcfa?8AN=6sU;JXX-67F8zxjiF%CL@;aDOhj!@AlWkP9!5N z0C6^jJtv6xRGV1$2!qWZgHP5+2;wjho}mU~69aB}#z{XR7=TB+nAzxVjblcS?`DI}=5(SV``f6xg$ z!-UF0sp1JR&#lhWetUa;adrOu^5yfZi&xvt?KJOgBC|v(6F^Ml6;DoRWs_D$K^7d^*@8cIlPRFEOK5Q+$21O!Ro;Z%fr!R|DJD(pP(;_aB-h<`Dhv|@K(9Hl zgIE3cSYjvG#i{SEfv5u4>5Qe%768QJ1gpDFOailnO-@MUbG1Bla9TGa2@f$O*xLhY zP&}Wccddt@kanb}oMvC3#N!6#7tkum4N83nF5uml=t=?jWPG9|q;3SaN0h$ zb4A2QH<7SN2_5&5){e7kt>Z8vp$-Q?A1$Wy$=DaRR%UK-o==8Hew;)2mU{p$MrXjC zziM!D$jB}ru&u(9Me1)3l5dd<)tk>!Sh!=7R%-;n6tr2 zozAk^&gGg*y9X!vVo;D^n_DTv@BG8x{lTyQ`hME~;^!ZK@bwQq{`t@U_5bf*{r2Dc z`(+sBxoW1|0EB}rv-lR8lhaxeuRB)&BEotGN@FByI?#cLR^!N}aIMxeocMuQ{a^sI z#vFu49HIvOft`D#03BXI(t%)FxQ?zesym28CDzYlTz{9nF$%H4jx>>QjNq5{GChFA zJX&5VaVS7qTj5-W=M@TJA=0v#)}-om%A8{X0Rd*7x$QRFtMiNVSFc*DZ#;VR=38HX z^v0v3lOsJg3ykYxpAIkXEIFx?F>Z}nr#aO+@3))H&Be{d%k!7duP)E`o7;Kb>r4)F z7;YLl&_V*XX!1*a7djQ~-qzfm9(|nj##7%0HB6sb;gU2Mhhg*8i;w^Pe;8TD^=dde zdgr^}I(qizT$`m2wG1fOC&ENB?p0V5Uj((M%mC?h#U231(7AqmOKTJ5?Vwd+%6wZ=Z9pep!*jaR$9zD zaW*G#fGjBLzLT*IJzllsB=E3)Sbg(=|Bns#`@@7+1 zRy^X!I4u&4{=1};a1gCLck$-@6Sr-l|FZw;K1c2_7TAVyfGjSa9r+<%aW@&jH?wf@ zrq?5R*17D8rM=ua9n$s!oA>TJu9wXQ)Rz>O7*lZ&&YM~gdctraRp)>hY; zRNDl8C`-^!uU)a%NP@%(gLehSM05d5j`U*423RZksoU@08S+vsL7 zrMjK0=sjBy!|W0dLp@HnaBe_CVYZR>zJwA7$tKg5avkU$Q9yv)`1s`b!Nar7W_z?g z9){uc^z^e&KYRDxcUx_?SdQ9UKsn&lB3`op+_z`U0HDR%)SA}67oxISmBNji9=C}i zc6L@QQ3o5l3uC;C8X_j603u43KM`TOzQ6NEwDDUuRsbSm6KHJU zG-kraBe{Kv^b`VEU!m%#u%2eK@ZyMQ_ZOk$L7K<6EV?ElP1Y4hL?F-k%f>6>c;iSq z)1y5JPJIi2Fq3+DZxT#j<#d8@AZbZuQVQp}`=QuHyD{htc zb1|uKAf)k^d&GR8C3&KvcG4MsfhNCSba6?l5QJ=j=^EOpO4ooV77uB z_e_X!z)n!OenK@`VygQAmU*hq(kD`&9}`#BKFFxLZu*4;T8>Z43?*ZsP+h!{7{{e=KE$kAOV2GsWZJ7_pZ(d zXKUkK6FN(pi$tDv4C~N)^gw_u)gThdyQThzt}MsrgPmcCy++LHu-x9b*bo8$Av6JC zE`qhTX{yt1zq#GqZZ`8Yl|oOSJbCo!!P%qJ_4O3Fo$9== z(|&t%d3o{T^8D59<;7-W9fEFH^;88A>o)Z5N->9vwS$HwKZp)QdUn8BHZM^NfV;GF zX3c@H$bSCxr$2q;$s6x{^INaBo745zuWxRk44fkYj8d&AcoYO1!CXqOEHMM-(jONBFI!cl^_`7 zMs*F9c#;lM`j{(-@JzL`-$#ESr{sE-S0V<&bNZ@9z7-(dEijWi2@U~w7BDaJy;Q;S z#fS}Yxj_h?+_3}GU-NTN#?)VTH{5R~28cMnpq2;jUOdUt@-FRn?IP$scL*L_CC?pi zzFU|D{SDCJ!=aDQ(jWJk(#;DdEZCEdoYKWJs6E(=Y!jU3GU%U+p&-T|2Kjx!OGy|l z$y<3Z;L9tVArT~=+aoLStY|uvJw03x#e=j=h+ktQ$E?d@Wk@#R4jq_k4m|emj6vEF zSx8~`svsnk0U5aBEi`?(Ag{&K=_BSGGpfF`q->qdru%3tmT0y~n;I3|WO6LT1_6ev zs~dXb;n6sRwZf>V7V&?W)m`3*-A+oHnsvXtzW(-izB7*FwBKPIALvn?h|x1By;jEU zkjL~EvK|uG!QE(&Arm#`;xLN}5&J-gYSX1N+1F=6L};DLs-T;wV2m(%C_j+lPPhO| z+3yFRw2zug+gw zU%lMk-p=#fSf@I(=kJhWHlPDkHSGkcrX3)c%mH|vmmXpqr%jvwiVeZa$;0>?rT`HT zu}s_T=YReegUF+=z4OVdmtQ=8H3A(U9g7Y#MDL{SR2E>j*Mb106j$9Y6Rz+ODrMX< zkweplsHc%|$i0Y=m)9Voc&$V1yJ0Lf6C6V@BsdFo0TfzfQx;KUj#xTK)=B?_h&I6; zz$4jM)})q6t^lC9mFY87KnZgt{{#Sq!X- z2cTH16n1kSTte(=c+8yj5s<>p{)xSZy?P8>dZlYY5AtD-Z~ z>X;YNd^S6naJE^+dw7t=N0J*mOqLxK3_*ff;T9H`b03E3l_W;-*A6unW+R&;Sr8=X z=ERNZ;n=FUPqa2zKYk}ac3iK6tsb*1p9AIKqY03i3>;MAESA-m!gBE#aAASZQsFbg z;@fF1jdKNbyW+RzC9o`vg#XQd``;ES z^EBxjC`7!Y8u!jos(?V^S%-)tQ_yf%u)$^-GV3{0TA4*uN@+wywYDaD2AgL(r~{FO zVFfdM=mi_>-jkCVin%Wf)y=mTj1(_3XFw2jE$RKfz5swaR76#dK-h+T+q#ikJ&PUs zER(1TsO z?N1O&;;98 zXQZp4)lClNrH?|%5-fJ8Viuf5Ibxs8CJxJ3{16QH#L$_cxG{8$+wb+z8287*!-wnt zl+aMm<1Z345wr;Clo?5?5)ObZYDxsYcv?Y^HFUOHc_hoy3JCQlU9OTL2<7=yK`0_0 zarwY*6VPVT^m`|bAj2^`_3>O}ySkJUw@=asSJgnQn(B%HE)i$gi2cdU7A=;VYL$aZXG zcji7g7z0=J{w&Z9DXMQ|zi?zWEu=GiC~0SM1=0f7M#!@`>8)>4Y%rje1mwp7M?#0v zY7xUBRg?W!a5)FK2RnJYc&B8&U4p#4Rv|p`i0EA`cR$-&I`r!7>+& z(rF z%QA+;paW}%)e2jqS{pZR)dx3*;6@m4y%uRt039%9($(d7A#DeD75*!Sv7i%i90$1f zR6k6}-5POFB-W3FZnPmC3_{{(LG-1FT%@XBqShlDmO~j3osB90LZuAA<3LpW;O(LZ z1anuLtUuUdcg(fwwlXu#OtKc3Y>pwW{Z$EJ}bJRD&YR z*aqv<5CrtXD|?I{yP0Klb`8RjhQ$IMj3iz(pg^Bb)_0#MhQGxv7+^T4sXMR|Kt_QG5QUE@Pj=iO4B@iU&lOlWtngr>3!tIpDtY zypn1=jP6cp*TYXGK@uHki0BD-=*>*-OPAqLI008`f#ATzhy3I~Lg_&#oFW}+N8C~P zD9czMJ|+c06^01AKfMb#`}Qp;2e|vgcyNt$31(aV?0FB!gY<<5tCVG?Cj{@GYY3*P z2`*&DLgN|fZtb22$(bNb&d=){y5tL`Qn3E83%0BmA|>p3Us@B9ydvlB0)}=Z2W)GF z>C|Dh{?yf7JYG+Gx!73Gd;z32&xbeP0n8yb(aDkNFUdD;s~z8durdb?0T~!&@+r$= zTp=9Fp)TIDdI2Ic)LIB$z|U&R#+ z58bGEUbsgH%jl`z9Z#LVr;}vsry)YIBIogoC%RM6^uObHbwFo4w z(_BjGA%Y#^jwm{R8Pif4)ne@eAl_0PMQcWE`dThmPz`YdJIYQ;EKL}e)rz^*My)nG zj1y5QvtpsOp0}JT$^sNR1#oY=-3dd;u|diYB-+BSoaiefVtTzG6CMtb!4(c5pl@i%|+r*D1jos+lUoVYHS zUC?0*ieh|#Q*=2PW;d6{y~HE*FkuKl0V$f5W6om~x}sVt&{>@LrVfcZ*O6_GTW+@` zRw}!^c;A7AVr6s{Ffc?F5Svq^;5-u;A`x2ww;C8l2G9e{OpqMZ*?6sAa@(0N=^i7A zCxBRny{{Q~yFidPJrLNjHg6L)yR2;bz1} zz7e!|J_w})=m5?A_kH6Kn@fVfdrVKmnN39WVF$~|>0XXa(q&`OJd{pO z`89({7oksIa5uaF2v|r>$)cY&BnOuz-V1Q&uPlG>te9_x8Gf%^>AuVL^qzY@_^#k~ z7KCzIJ;@fp&j|<+PZ5$O=Cj9OoolrYed(=znc{HwcSxFa2@kDZs;$@dxL{;x>(*fz zvM!=H5g9-lVtIJ>;Ntq`cs&*;)L8T!u>xSdG1mOEh=P(^0k9#-cXqSq1~G}W=oB&` z1g$n9@gL%2)0HACXAhL;vcf~Ivo#2uMfMfyCBRkXoc^_||kiM7h0#dQu z5CUoH4LkE7>0%-vCE^@=m5g8jEwP7R>09N;Cx8J{dbvezI z5r=WT+3Y_1;(5KjebTt>_rLbdZ_TxS_LHArtsnm22NSW_kwQMB5@SidFOj0TG04!I z>odchL=71PY{;rNi^SClMV9K;DW@)YUO(tJ@6ik!;nJmEf9&|h zL>Ie9OkAmWHVwNOlPxR2iCZgw5vu4K2~ad^((Uc#_bp2TW!e#Oiq@bR3{{)dlc$p<19A zJEottET6wuzr|Pn(BR%%Q?V2%0DyxYs|CZogkSmyqz9m;aX0>Z9;=zaa`J$Y1UT4x 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 z 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%0D6|#y|`RC{c7DS>*v9uY65Rh^R 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Œ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

XMfDp*JeZEL9j#w%s(&% zW^U<5zH4S58xf{|fXqUtMyvy4jV)djRUO6>T0=6i?}!Sw3jM!^N=;s<$p1#7YI4TU z1evD{ij$_e=%Qcv0tYr0HZUv1k++>*;Zv{$vEUxA3GxhkN!iHp$@lN$D@w%)l6DFc z9NXL4UOuL`H@COJR>K3ww%6V1!4JDLD4?(x=d9pDv&m7ZjyqI zr-hFXI2(fQulMF&TGrC>|^Frng=;OV8paJ2Z~8XyKzlO-akPE7)#*Y7-$5nqXUrzP@xvL%E`= z>3P|(CWUbFqd788tAQ>$5X~RogzpZP)g6V3&oLr?QkqUAf_$NK!+XBrYbuo=(a|rx zY7-ie6l(t>2lOIP$A_u^#u_%j0@}0ZI5Qdkt)U4c3-bjLeqN3<^vE$QMfGzso5nY4 zP7rQtR~gyQ4xTYdpbJgW-{A=~PtclY5rQ5nyM@q{`#_zkDCU zNlwjA2s1<_9}B7A2!U`M|23JJV?Rd%<TC|9i4;@vmtWOsws`m)H{k877eZ(6TGZ-(qZc;i(U>r*cGar zTjkwQ{A2u3PxB+ANl4sen4q972i8bZanQUr4;=i`|5qev`_1=+LPpb2a7L=HWNZ4< z^L&spbue7gk2-<#bs;{IZ}7{%q)}E)Gd*#i&2O!gj3c(<|KJGLS_+cwvUMNtf5Zd< zd56_|s^ZsE)aMS83#7d(fd|LP>p8w$Hx3cgQGvX>KIf>%&)g-LH4vBaQ8wk8e`g!a!-kT8j6eue6J1&i%v4OUA7J#lSmXQ9^EUk% z8Ae2GN&$p#mjDT&`(>&)P|97>@J>;JR$6ahWnip}-&}lfzj4aPH~=8-@ukE-&()9oEzO z{~PN6;c$F?JLtIn_WQ^b5X6}5C%JPA>?HIxx$rojDjbojMCeU~ooxORS6p5kYI^1_ z7ike(S^ZaG(i;ouVkYe?FiigXSGCDP4npXqB6={B>VPvU)E?dc#R|hH)HpxjRrcWn za9z9lG2gPy@BVl^TR;hZ|71S&n@;C=-`*=CrVSA*2n-l-o`zoB&{PP3)1SL2g$!@UI`lpV zVTFkh8Bb+30K$^;D42*)ox!~(jx$hqY#oBY{p0&)8c#oSRpKCxvzVfLQMyIxl(t{H zS8}CNtwzIm2yMBZQ-bzNcYC@e3-RxB3JaS#?M?(xc!$MW?i)_iqA>p*6JZUl>78{V z)ppNUY5rgp1$J+PJCPagTC@xOhXN1Jnd+48SzBD0t=|q+MxNK>Si1vm0+Asf8a7`A zn0me#>g%^}s1hGlTI6--Ig=11L|pud#z-^V9B>5v;$@9wbxp)aWQ_8rZ@8I5pEuqU<$K?A(|K{fVd+6jV zSbjZXDq=bVZ!o3zH4)AjCKn)@r2VCD)`V)-ra;03mfNCOLJx z_651LHsQpyrUquE zDi#_kyzyoG%H%FN9Yhe9JB?AQrX1R67c()nx-8r%VA!2qp)0>Y#i|o* zUe151sSF`Mn~YopO7q)PIV*h^wq$+V%9Qc^R+Sf1L_IJwo1hkvvJmylpJ89pKsMLy z$&9Mi$EZuRF!bWlp>FO-P$VDRKkos_e=-%_EN{OZ-c9p^)<5rTJ6fUP{7b1;p1{^Q zSS1CINoGCUHS`RQ^y0rfJm9c?^JNYW$97G6a1 zR~?!SYVln%H($Y{P)FOlo$u3! zLD!beGN_-v2(^KoT*YC4hbep#5<;0UZ9%sYe#b|GCeVSxgX##n0)hr18f?hifLvX# zwz@mqo$lUVN{Ck!Q6P7DiNWN+!vT12Yf8=6iM26=ucQ+DCZ*@r*X8y=0U0pwDr;J* z?fVbr-z>Bf-CTY|Sw44@%SN&RGF^n|iHZmI(&`HZu%zat z@_voU$N`{#PxbeL*XQn9w7DhJgo2TGhIX4cKqJ++o_o;M zXf0x}vL@(d0phAC<(Iz|C(8o__8SbEMhhP4vd23cKl*i)H=kigbN?fd|3>@ej}I@E zep^HOQ?5s4L#ACi;dOf`*{|kLl2V^zVG^C3s0GF6XB%+^mZKkKSjoe7NuOR-;-Z^O zV=j#@eu=%)pV;m6>K-gohpW@Nq(sv5t#}*Ehbk3T50!YVJ zR}K+o5QWXf1ojn&+P#fCN!JbQ7?v#cc`xJ<(`|Tn=SUp~ce6QIQBQMzu=X5LdvU+y ze@z4gaorg-tX{b?_uaF>v5D)1Oj+<_1}1Z zQJgHMZ25hUM-157+WL0A)87Mf{rqUa%;9fu`^uD0UJ~DEPNmS=*(uWZUuyE>9ZW^J z`t*@GS?>9G*s*&COHfYs_BZz@^W)>=zyNzBFHnG^BD;2ad(71T`hsZ!6;817ap!F zvEbhL!e|jl}m%n1F8hiWoemQ0U(0RfU8R6qKB|mP36H3%je_e z0^|z*%c>=genu*8%H5a^+HmsSkW@d^ZdFl+&2dP=h{lcb?|RiK7ogC zAvv=ln#1XFqKq~C zhdSBIj*IUKn690X{u-IhyGQO%bwn(UV3}l@uott7KgIIm8dq$uwUcn{k~ZH!H>l3o zs^aNGu%XlAc1iWP=QWpbG;yjX+~ZI3Q|!Ku*C@BH;>;DeJsgkOL{qYUMW=(Fm&LsN zL{xwowoMfijHxDKUacfuW`x)_DiiOz$!)rBVz-9`gM0(D7n5>#TVD zZ0G8WHT>e0twfT4;c<64nfYHAO`RSi;WqLp$Lr?6wC7{72CRhoI6HnbZ2;4AK;RNe zCLKl=whpRwL^c4to@wy(rDXc^gYe@c=i`RZ_x((dA$2@-@^D_BABng&=7ss32-tqv z^PKt#et^7ZPP)9m9_4KNK3{`}?$7J1&wg9qr*;0f9WcDxIn01PGZ1+khSI_tDf*wF zyiX3zH8p~>+CMONS-c+(JR$WD-kK2d5(yClPz|Ye-WZYBC;R&^I-YFxdOY9v-a##y z5AU4kj#GUTE}dOXRfzzloo~Qm?_3WkDn28H^m>Pi%CCaoEyPd4mbPFo0*-m?R(Y^n$(IUNT39jSAUDOlrWG}>~u zEJp^C3sHtvn!3{;Zk@He5OwhOYD2}K0F6kN zc|@&VF*yU#&_E!4de4yk%qa~rLI7jG()82#=N2%$6c05hO?t&oB5rU!iZm{xvfj!3B-Yj;fsc~S0%JWkV z@`c&75PK;XSrE@DnMhcNRmc&#>v&8CScSocgU5s+yR$YML^l21&D5sN#z-N_^G+Cf z<1a>EgG#j6I^0~~GNLW5bg zJc`+}uVr`w>hF@7{o}v#_~~giqG^aZwGR8#^r1%d7f$Z6jN!5PT%+&qDl8CVbj7x9 zV)N-9{mCEPeO~Im{5nSzRC5e}DrF)gXcZI%azkoq+9~AE#$=Y#W8lOY(f<~qXak|c z!iY)r$%y>C8WnYxySj9?Yg&3<7E^n%A(q#Xf>)+ruX;dt2aAigKJSw*4elQ=N1yMX z@BiUC`9W_Di-TzX0-TZiS+CvV`I9Cc>hvsdDaRxBRa-wpf!TcC?V44WHdoCZ_`%on z@(jvyU{oMXe2cHALIClQcq}2_PiEK4XTt2Jg!c6!Ai3@skuxV>C#P$+-rsKD zGk<{t5smI{{4r3uK|m?@PBjKC_~PfU%?hnyTG)=ps%{4g3XM};V``^}Jl}Y9E+a~L z9@KG;dD!TDwsjEYb9j02)X6TJ_Y7x){d^u7Jvx7r^A9bdWA)Er!I1qvOwd*Qky{n_ z&17~{MbUN%I@8#9;6l>;LVr5plu-dvfEyf2+7Sq#A0J^Ur0WyVb>gnUpWMsXS@6_#>pm z2!;ZUY0yP1F!!uB#G6AyS1GPb@F*uBH|IL-i4O1~BcrAxCF$cb9tD?BBqvcNsXEEc zhvLHOt0)|&BqO2I$%oXp##b|(6yPNy!L$!?R#Rvb;=by$!@E_lt$7cvHBlT~Yl+;o z)%G=g14NZD4dtB}^|HASn{+9-AVXmpfebd+-5GNL(>1)3K;a(6&$^N=g4dK*i&dwfRI3zl$Hu%jE)U91N&i^(XZ(Xm2f{-?2XXcW$$*xT)>5RcHrUZx9P*mM0nrec!`o zg*sX!O)Y=ik_OQ}V=z7o(bd-F`*J$@D~CTvl;+6%{@touyO0U&BcH#%&K6{f+xmP^ zJAN#G9_m3!?`Aoy@oj_(L>@$h8J?TGTeYm`5iDD{h+EZ00|0m-!nw8T^c^sP2Z zhlhtdAD4tK>(jcO;30|%cE(9HR2n)TGpEb#WA_Era`my;^ZG07`QsgA0KPbO`j7f+ zwRH$Wgv0*An^6v8i2t-%cV!+qCDpX2@iHZCh(&8w=9*7MF8?xuEiz=Va?yCQd5+9nMD=z^97BxK-qYhO=L481PN8nO^Ox3H1+Z zl|u2&ExVM~OPNq0{GJa#Jj)SJj%x#7Jl4l*C0o z)CJS~lJYk%MY5W9I*JTna4lmcNo(3PsQVl5K+Ov$5lze11{96hpXnnHHx`VPiu;Z@ zCL#rxEwsk+^;h^jCr*rMNvZDva26HesJ0hoB$eod8O}xD)IO=O_sOx$P^EvQo1POH zVw3l1(pINLjt^RKWx|lb>I*cZwpSiqp`%SclTfG4vsNe3z`;q3Q5&25RGMTTyJ0NJ za+o59#>d+mt{?)hWF->9FCUPtU1j#N?mdA3jBQZt zvb4vB3v(3Q@6)LTqc~)sHF7k+s;DX) z&!;lwL?3nq{v-QSP0sJp>=wcmUDLcVzOw5{nz;T`n`w}I)k8W@;C+C}l1-bH<``Op zHv@WkDs{6rEI+o&+C6ZRJ1LxmmCuzt1sgXh15$RQ}S z`BX-ch1hLQFwmb>0Fue-N~HRDp0DV>!idzsBmrC^?``&bbZq-R3`S-y1~}5REIxT7 z+PA6G9)c6F99k2M|N7rIz4!=2$*72f9C(mPsyWuLxl``WkM2@SYsGtQGpqer zduN0`D_5?1z7Nj)nL2tpF?-JsHQl=W8$Dhxx6|A2FR!Pss|}_kXhLZZ-ipa2jKt6e z?zi_RlLg{nE%LpRFmwkjHhF!1@CLQ6M@u+4I&Kca#i4qwRkcD(FRmNyJR7GuiV0120hXsZ#hXJA`-OGbZTk1>V=e2 zCT}W)qR@O5MQbw_h7*B>$}j;-`pFHb`fQK9={}$HLfdKp0GJ1e;ktVCoZ`uGe)od) zQyaDMiqIV){1qMHDo+eVU2ziU5RiNQ-XT-I>2qKBl3(8la}>cyoQEVug>XrV$12hQ z@zO12?R5F_S6SR(WbAWi@!WYgQdgZRv;{)|b8pbXy)KOo(>n?xcfX?*gDU{KFMpbx zQhg~?R0z8QA*|OJ(i&ERnnhyUxh|482(oZMebzy%k2$I=NQq0D{|vP>m$%-KxB2b+ z$Uf6K8cq*&hRs^{tVnIOn$ZC6csa}NSV6cqw6&&{G4rgYfQpqms=jb0wy6Eb;&0;8 zqOTU0C;;4Hqp;~$mvRF|J7Xy&aO_d@5lU4UQ0*8S}+pEmEicH9GXkXeKvl>(s_Wl(Oq_UDo=pN z98b(EMdOqpX`%&ybP`!kvR?Uyz0RCZPWj#lF`LqG3a&ZDmrd>mr&F_oc zFhXK30}gm^c09R0xrX)|EIl#kdb!*k&oUzG5VCQYm;0&jZqG~~`hGl4#~X&--=8Ed z9+1On>*xm8?8?{ZcDaKN!Tdk^fdh+==h3~2@gLtanHkWCfW))l55EW}9;`rTSI1du zML%3!=BBkv1D^|oi8p4_(~O8~L-%mr5cQ{1VV1ZpUqYVVNYkeSnMyI_K~jjp%9RUP z!gp!dvR)3|6eDtdue=)jR|Fdh03;0JC9~&_x}nu+{yt-ON!zxlPZ>wgDPyc`3`;J} zuzU$SnqI&xwC6z#$A*BP%6{r%3swE`#aP`2x2KsrA}Ddr*|ctY)C*r;X`wD}_ALlo zg{Jq^7nPdj3Z;Y9;k*_&XPYdUEoSJ0$6wT-a#O2cfXwoX-8s1Jk1N32Vp)M(;T;%Yr( z!xqcpzE=;KpoqYR^E})KhX8}o@q%bHyW5qd4#R#5wz=aMd(E0EZ9xDrLcfLDwNY7C z>~qF%tffY3fWZ~fb9D;nP;T9t8ws(XphLfRlSkv0#6gvUGc=aq66=rbE5~w z$>2RG-Vr21{?VLG_f;#qdvpyVih(1X`z;XSfsOD%ho{rk_H+&$f+MUykQCBxY6H$`Cr-*$e%YCPx2vsf z^}@w=yK9{g`D(j+^Wss$ph?sFakl|1>bw}ni0m;U?&SrVm1aii903&^JZ|?D-`@4W z^Lhy=6da}asYg%1@8RTZ@9u8T^||==aJFpg;}eMw`R{4l*Vpmx_~q^ho_P$mmh-!p zxAOys?;Qsgl~V(X>pE(G=moKNYmeqs4gIeQcfHzhxX3w#!={X;3}}H*Fij1VNooc| z`0L8(K{zN&l+2XiKaPd)n2``sz62PwNHK)k8~*3}`W|eD(SZ&wIj!o2#TV2uf4aG5 z@^ov5z!5`UO~WL02qPl!f)v`Zk>g>bsDE4rlgrD{i%!%Kz^{RW{|wcJRvflbDQTT< z#RA#kF;!}RSIy5%eQ)N?q2P$%9{TYwN4mXEBlZ zt_nbH6Tl-XJ0Sf=cn1Jkh%S;P=Y(!aCpD zI+){kdy@ZtFzr!;#`YkV6k41VTiPlf;Ye<~8N#nAb_NHDu&)57Z$fayC5T2-5ag!% z$UsymAlz3|xxH+ZKs;Cz0#{GL(L3y6xipq_^DASz!d?p$Dq3V4JnLXMv&;f+<$~e} z>C)Mm_MVvjC=_d?&eTK;OIptSrYdyPc_+fE-wHiVHfDF82=SImmEY6ziG!+;*$iF^ z!wy?9#On+bk*y{+v2j%y=fqbyysu3V{dHHRRS{isWn$d{_zdnI8ti(WNeh`9*;sy- z52G_othVePo*tgcYgaO-;D68aq+I;n$=M3(0)N(c#!DBZN{5wun~}W#5@b=fXGXM= z=Ss6YP8w&XiusLP2j{o$TJc$Pl`Iu@3c53!dPyrh z5yHDAn&{ZPT)Y4c%V%%!c--F}$b&fyHxHAhIo|g6?u!q9R!}|ru%SkYveHYdtNnoB zImbH;oDTpmX?Q+8y*-HK|F}O@U9qy^-|%@~{I$HyL2`RiGM&TY;{e)uJUw;zVC2U` zJ`4RK0G{Ft1mQ;xn z-h(35#sRwr0Er66X$Ra%Vu7+-Ls^e+!wmtyYrpsd{@H;&Y%*#^xj1E7Cy;?(Hwqjv zv;vbOf~{h~MZy~b`?r(!Z!3V}SNR{#uBrc;u8}(_ScNNikOqUNVzN0c zm5^NM%G}{ZGDr0FG*9W-{8fLr-EWy?==^+e^tt|$<*5b2@|kvfg@}fyr8nd*6C^isCZ?Bhz*;%bWKn(vx~!bHBkqrX_c z=j86mT1HT0pi4F_QI4H_a1Et7W>1@ZPJh1mc4_Opxqh~MUUF=|Q9Lp!05M>(=S$ye zNd)2Z#%a+5B-rDH5E}`Hbc4cNK%0hbZ|9NIIbOHtp@cpgHm)_>oluCO2HQ`Y;Kyx_ z*XvibDGW!{Ht)|Ja7r2+p!WWFb4L^`WMjhF0QNpu@WtMo&QSg}z*++FGV*t;Gv674 zO*23B+bH8jN|WQTO74VM()X9(g&pb${^_BX0_6yfCT4sS-cd#c08yL*{EB8c^%cgX zs=EbT)ep>G1brQJ89V7?Xf-4AVjWs?rJt&U@l;rrfi^WkkRcKSE7R>+^PI@k45;K` z`fy?h?o8l)loTK{|A^o8!&FR1JOpCubRAe(F4rp22XMSmPymbv!#+faufTcEl&SC+ zumXb$0j(i|64We|s)-1I9F(u(=y>Pk>+I5bxVh8w=GsT(rcdBipbn(_?o2f?13^?R zb&$ZVBhe@sH(qE90fCX3%aA2aDKx3oA>Mdp)IW1sy@2R80SkPa(SwpUOgpH!L zt}9fP1yWL4q>Nu|_I4qvQuDvMRK&C=rq!mYlb#%EQEaPI)V1u*6vk}YLSiOw7}Yqy zXTOo!%%HadQUakRWC-vUa=Pu%3YLFlik4eB?hy%=k8|7iC~OBeE#BNyucX>o$d#!x z)^(ehQB90S%YT~lL_54(B(M)$&wAuX7xGO4vQ1#u=N+Qmxg9CR>+_^zqvLr~v8cs{ zk)!5Y2v8x|6sd-n&268loE`5Q7`B*tW(L^Bla+=G^&9xaiOy5Yq8}sdoUBMVllOBQ z^rsSuAn}%4*Pj{#hlVCLlFW}G2{-dTwJ$mb6|J&W7^-X&&GcKT&!IWF#U=^6@rtF1 zy&hLheV+(FTsl^#QXPSk=2Q(y@Y8+0DL?%Lh)ZPfHL#gUh#Gi&?l}i)eOhrtZ!R*g zfH!vxe4mGzwrK~$gnAhMD>f}U%lOFs1>zjUA|h!F-~`eCYt>-esps|dY;mw$rNi^G zv{DL_ksi!Q>n5B7ftm_gb0%M3w1c)cw)E&y$KB5%%bcAO1j&1iLC=f3Po#C6Fm0xT zXXh|G6M9V}$&d#0vKPHYqMFd6rAlcugnS7>89|G6>rjzc#VMHU=x#5fs2hC)X_o=y zc<;|KLS9oQ_zj4m8-qa7V%DgBiEskGP9)+=0-a%ZTkQ<*P+mGN%R%PC0j_Tb+pa+k zlP;M`r|rk^hVhx(rS4)#!K?;R0HdkUccKX}z_7!t!B2$JCr|dlN>u{dPf3pOl3;6d z%a$WF#u!%G!qPLUn`(Yr6bnHf1`*APx~gzX$Pz71DR_@sjQR`D*Q7g?F}hs1W}FiF zQh)X&HTUsw&+E|1#|5~PAdSC=zV8N=j_V{QB7pRV&4)n?wwy^*Z(4Dk?`9GZf`A6y z?hS0MeZAuE;C|=a=pW;1PP?fDafv{@$2bQJEFg7P*L}1j@ESfIfs68zN$%w}xc$42B zoi4sTU7)D;+($e#Pad;w8@u#&u)Ds#JeVFi=*|cE)%}m6bB?RCjl=kf%bi+F%eK92+t$*;vbk0# z+qSjrmTk9eFE78(+n@Cb=X36!`-kiLUUzofJt{HFI%J~+d2^krmnY)^*#$W<*f$)G zDsD-#{G6{FF|D{f(5#luRHN+$OHuerR%KCKmNP#6@17_DpvrsDn0V62=Sj_OYwMrs zMoFLJ3c}z^&^^QjGS~lj>CL{pk>{@L__JC%-5N--hP3Q(w4O?ql@JRRp`W5h&GDPc zziLd9*>+;$ArVhBXINKFcf}SK zs6exb7-)YWzPP-!tY0C1|EC0q7l3Z{{+K$4A!Ura&ty3YART&pM}PpGoWT-fGN5&P z!UXyKyJ&A;Ygft<>TYZEa&exUvdCBS9)#J)7AF-dJ29J_xm-!++T#d4H#l z?iw+gOXf>Vm(o3<-)}!&n!RH$1x$sTyLpwCd{_8ai>%fv2g7K zH?2c@sZyT^0!0)is+x)%wN*#twKyOdqeOhYD4dL{jMt2DmZaFD05rp5Cv7d-Ors*r zvJ_A($R;#q^pQkC!s-xOC@+8a=T~%QqfXCmeTEzZ!#J+Ozp(y4q_M-lrXgEu*k%NE ziVoGqp-L3vCgwtaIjJk0#i+x3RjkUzMdQHOPp+R%QR)-Qm@aD)^~B5JLiz*yn8YTc z%ZLMLI!!n341{TTGD?n)3cX@kMFM7a z-Iz8@m5R;ywg^{+tK~P*-Oq}Ro!a8|M>39im7`n5bLT26jMQv(e6VF(9?-=xrX|jc zWs6;@Ip3>pdyZ3BHJ^=9DXWZ&1Sk8`7h(w5Q6|uf;^)u|g2}o4^1eq* zOw~%^e+EmZIz_YEkf34HvJK$^_DBAli49;#J~x&E?14rSN>VB`CSPu^5+W8(-nO%y z0f)>QQ1U-LE+qb@@F01r(9Cf}Z!bjkQ@uHabqZ(`}ZsCDPH zzEBTjUn4P(8!%aSXUv)K$@D9&*7F_DQJP^hNv!OY9XZH?XecRl#I-@czFQ!Y_Dl0y ztk^C&I5_ga#*bB;`f-^RZ86%ZUw`W*VJl2z`zVb=J`jyCLuHrT$M$=!2kqV9!r&0f z6wrt6JcK(b` zB8pWz4zn<sRU-t4+o2%C8Cj?|~7;zX2bv?Oi z-SKaW-oPIUf$JQ|`ejl*qDj0!F?aYbmb&Z0T6*?OK3)O0adZ&{%&mOhlte?F=qI zNzAUY?>=`yM3~(J1tbyU0iQYV`y)+COh6%;TcD~Z!&-szu?luvYljhi-;yl#Xn&Hc>KEI0f6 z3;P2SLK!N#?d{LpHJc>DkynoqhwP~W7evfBW8*LP=XwV(H%c}3)ipQ~1H05QDL57A z#DX2Z&-YWCe$RmPK}qQKcBH=KW?*(#_hAHjdZ0Fc#fMApmJp$YbwJ0`-Si~zh?*xI zI#amf_$m8SO1<&vEw|KV%@PzzE#{658d8$@4jh@y&~kP{CEg@{k1L#XZsWAZ9moF5F~``jh0$S5nane;1IH6Ux& z5Oy)J5(7S2Is&=*_Zdg`6a257qPV1jqwk`{=`Zsgm^7(LgYH55R@&a1xAZhy0|Prw zyhh_Ym2*2#mG87Oq(Qj|5tEu=7~)nRjTH$FDtIV>-kRyGNy`wL@S#xH_sC$xrd_BmL_I~a7oFfan{^`nYedak-n zvk(JeA*Ie=dwxLugl_a#D9_;r5)F!Y&#!QOa{K zMkUhHy|7Hu9pj3u6Nx|pCA#o0#ZNnW5{+PA(Z;o~dURL#-_OlM1>FiM#fEi(IF@z@w*w zgMB5Tu776(2_;HyK-`tP`0c@YhP%V2px4X41SKIIrj(n<7hv!DI#Iw~14w5cE?7{e zguF$h#~)2yO{x=xaS^}d56>Dg4ziNU^0HPVj^%PLop&`>Xu3a$2dv&%nV0BGMVn*IUbc=ZZQf8LmZ^zaHEU35#tmvHP%3G6`6|-_bpBB z;irNvjQ?=L7C3@A27mz%}q$ar_R7Q(WDGUi0rZp zbbnh|`Mx-)Lz_v~qMgY+4E<{O<8cId$i(C3qA$m&%j@~=e&^)+;K_^CsKe)x90b@m zgF;A=^@P-uU`1h(lnKaASclrCkWl4h{uGu4kCP*kAgD2-kwA^=pAeNdt-3 z`+<~1lOPW2V~R@}Sa~T9RH9xi0yZHT&4jrH7R{yzBp?RgB?F^s5KB?! zV8g~a(z6=9$MoW=^}moa*qA&KF|7I_NfA!ZPrRH%RfL?z2Q6!#K4l!KM4!QDb5A$T z1nl@VQ*ArSe&K8~Rpk#?Y|`*#5plG&xHL~VLM$QMAEyJ=?yghInaZrFKK1F7uxiQe z_z-KS{}p=R{7o#&phSfg042UaFQvPhsUf2H*)NlMDs?*iZcVA)yW3;vZBx=*Kd>a` zAX6fOkuKzW#J2vgp*d!o^dlMjlQ075V-x~2q4HBxm zn$D|Mv($nC;$Vo}@CnpP!`!qW6IqZbzPgq*7J&a2C)?}rd&oxb+f@=wGcdAvrUT`u zMf2{nTEe1WiJ}BU#e$a0+w>KGpQz|&kWH9@aF6nO(U(4U*>&RcGlNJ3@6=#PlsmdR zeIM@oVjMP{Al>h$n;&NYt3bQ^B@=UXHovbE4*?JBZ4t-NB$WuAjK;`5uE=_iD4b3| z<5n$B;PjYnt@ie{A2$}9z!4M&RfM9G=KCswX)8hFxaPCFvi8Bbh2=ipvLb~z7z(LD zf1DY+{(s_17SYTH5{5w8ko@^RM_`m1m`G~L^esS~EY{hiA+^+{p3PDcLmb7I7vYV2^35ka>W87frk}6$p=}CKzL4f_HF!dnVQ;Pfqhkfaii&s z=-y?LIF?mT`u| ztts3S42Av3B7@O*@v=n&k%`@{&@>7f7UlnryDv+>2RD8kBoL{>d-zucf5+3w>(9jV zUOqYC%*r^hlSyXE&O83fG!Na{6jow`PDbK~ve(FRTZr<0yAa$p86*Fg?M9IU@nvt) zvTD54MqU4-uz6{;uFTn_1~L5vzY(=o%4z;(KXNu*$l~(64cSMKm zTII$uwz~R~a2}O`H1aFiy*5ADQ$AyP` zcUi_QI(fN-`}@boSqE3^LtO9apml!oRTMCqgJ{gLX|a;Mf3i^%d6auq>|DO$I)KzhrsqXSB z=dX1+>#}rTc4oDPmE|nk8R2YO-@O9U^@I+r#V4yiH^i`1UD|H}-r#j#rd`AItrg0? z%N22qbnhSJi7*LSb~L32$I%pd@a|5D=X_(IMCwJ0S%yS#vKf~83M zDou&j4syz{Djje^E#m)V!18-GG;QKg`u6W%5agySXX?;k2?GO5`KKui)`<`_tyjDKP-Dxj9_|{XH9*JIv_qdSsUt> z$mFVeFN80(R;`N0Cz4H&Uf|;jCs)2`#leTtt8eS|PB6N9Rb`26*!u7Nd>D$&YIeUA zIYcoQ6Vqc3>_JJY^j&qif)fQUWzBhb-~_8h+brW(im}>t`;E;Dd!gLnlaqs;k&j3D zM^U86=98ZCDDu(W462jaNXblw-&&J?1yx(yG9fZ&-uZr=&qx*MR_9sVbe3gzlS>^ zhB4W)CcS}X9L%;20B*8~@Wc@_wiuDohS2nrLNA0>5)tbEEViyqRG1QZEHG^d@CXC~ z+n6mf)=9Zd8ZKvM$^&AoXx!4ueYAErG&`H$3fd@YgE%rYLng(tQa@w_&cw5BEvU?) zXtARb{?@jd;%v$k>3osdIUat)YIVXjP*W-G3pU4JDp)Anl2TajZwci3jPD)#F(Yi% z=mr^F@zY+{GK4GQ^tNh?s*Otgl#x(`rjPG16G!;xidvtZLm8Zgn)@_~byQ$oA_YfQ ziN^_aF};T$p<)+SFg06-PbxNfzI6NnI*%c^+-~$5i_bi%HTcPQEq5b1c{vUYUoUO1MceQo_ z-uEv5miNbnDR=jW)4TiYogJVt4hEF=zOM^Q?XOHl6lBfr?rZ1wfIh(h(7i1z0jpg= zq(isT$L+Au;Q_>V=-&Bmy8A{Fl5A|Q+bx~0_yA!w0HrHpe|AM3=IsyDMVbMB38E$J z0D1Xw26bSg8d|ZUMJsh34p}_mi9Xr)Sd@#cqWQe$UAxAB%2{2jv!YK-B>5z4wF?>A zR+M|eWSYNgdwyGysFHA*WFwL~Z&VSxH8+n9m^%6{7#Yq~GP@ao2P+#igv0CTKS=%3 z_LXpS+Y59~d#{8pj&qONpO$Y*P)GRsJ+PHcVKC46gLaF{#5e4BdK78hb{LN6Q1tfo zL*N3`t-1%oe(Uknp3Vkt1PA-ppRX>quW*=qMo)_NR999%i@+N5ptPH84tcmb*2RRH zNZ)iZZxz{CDa@Z(_vj`UmP~nUw;L~<)9EP;fVkEw3`;(dQezSroJ?WMoUZDYkA|+_ z`8H>|M(CWG2?v<`pG&An8(f<@_0%;-1)Gl`EF9S@tfEbFBx(lg7Y_rovx6orIw85{ z6bM1XD72(3stBymGMPnvEpx0N$pU)Dp%6rmp0e8n`;|*86ICb6)G1XFC~pyh7Z+`3 zbxGhB5OC-Rned_1g9lNpC%Q9PxYZmE^@}d8%(6=2Y!$XMP#YTj8e#S>v(()=MOF|i zuBN=ux=rrm3_Q-Du%U*u?taGE#&h2z*(nBZc5!)R$DwXVQo$-4ef zfGXhoLQZ!0FD$ap-eC(tkJ#6(mt6rdWe$$tw{!&EgUsi?T=Xu^x9m#kX2Hsg>TF{# zXT853R?pX*n?7nfT`*B>Sb0}%ttj5n*rWhS{d_k@sH>x;#pC6lBSIi=igJa4K6V*J ziGa`wVWV7J+L+~0>F4~)EV*J3j4DFCJ$z8}10Xga-P#}6zjLVZ_j`Sc@qgL<9}N5& z`r!ZAzIk8&28bH2Pn_ykNK7eq5-%JsO%Z?~+9hsa#EJv*c>n%>ao$ec{k{!o(n_YX zl_3!W*9l4hmc!pedlUFS*w{2MFck2^_Hu1;e3+>Yi{XeQt?+eanao+AW+4{yFcJlfW259oZ*t!9GL`ScgxG*aX=N0?1SSOnf2gOaaNU9#-n zNvH`Bk2=5F$b*2~>cSN9Wi=oPm8PZevI#e>?(ijNxKXXZ){iMm-aW#A@Vvrdxx} z0l}{;=OLkY7eK;?&Jc8<=oum|bZ(+&0R~iX+Cau^0GI`n5EKMK2*&-%?!p=@49$XK zO+dQeqTi1@n+lSN<1hbJD~%lpw(i2}7mN47{VEUr=fO8un<^t_oOVAmt;my(B|qE_ zJM^k@an`8REE(;=<~H0@Nv@y;6)mRhKy=sG;B(3S z$t$ryF9xQany$7i*XekqOwG8t-Re_QJ<;zF?M3MW^4lp#bF@RFlJ9#QeRp*o8!O$} zl;M@oFn`8~eRpS)gy3fcLpF3Fk19Uw+lm=~dz&5$m>-XfN_zbz6`~tcMPwj!puTjDQi}n2;v}}ke~*Vb-TnZ$=d#Niz#QJ)aYAZq7q74s$ATQ{1`X<- zcJaSM%Wjn=+9+(p<@Bg6J3Ir|J&Uq2O_}M3sguYN;&I){`kDFKU@MB6A$gn z%`@cKwvG-4*WYY)YBbE-2r=v%locpnX zz_gzuJ42?DaK`PMB?N%*a?^D`63yh&UUYuco0#;#NB=8->Akk}$0Du`qe{2(TTmOS z)wUoResFp!wtozs-&jTi6~b#26p%?KO_n;_vQBKjl(GI+t3587`&fyNai?J+Oa?Kg zky1>GM(R=hiq#%l4?#GLB=KE>Vn>3{2Zk3uH2oMVP?+L@{k4`Nb#)xi@>SiX zC9LY=3&saTECE9=MNXb?W< zX>>{UeER1`VAAj9Af-6ua6rD~P#-R(&NIhPz>3zexMLQbq%jmZfLDq?C=!XC{J?R4pio@1{Q> zYycKo>uc_(cfeYUI^vO^{l{nKx)J*T=^o8vCoF-d!CyjR&wr)la>ryLE&2?G?=Q}q zcNurUwxhxT^#W~`&T(`JXwuJ>!LGzd0;n&I-k+8NkpAwUbwys@aK zDr7Ugy}kwtTKN7ui`SFG9HVaEXF#b82tikD|EGlvn6jQezq+N&raF6hcxYE?0wt3{ zr1B8LaG6Ke#U@^wU|bYkVw7o$?J%v+P=Q?8hglmwaeAyJs78wT)7sS$7O+DWD`G8| zcV`OUEMXN|fq?L$ai-yfUTtG)VP;Xe+}s#ji$+bt zqUnO#EaDFcQ7=oQ&ne}}AeIfkqK#MGV&=y`wNsRZFN?XL zoJXz4`7Jh3#g2MYZ(^N?NU`M26Fx&~U&PicjPV$eFrm`eFCWBk@-8i~#KePG=WIR! z0m6v@`w;i(k->!!76~NJ5lQYAH};ss+TRspuryH3k_E)Ve{b>D_HWtbw{>gp`;Ai$ zQBXK+CF2~`Fle7oy6s;01rNzL6oEud%)h0QPtsmqT!1nZ!e;=Z=n{Q zuV+MU1Z&Og-r!d95c59%*{1=jt+ke3siY(WT5+X}eGgFn`|(P6+-9pmTVH>U!Yqk8 zoS-u{yI76L#PnFu(j&UZYQ{U_RhygLI8XejYI1dZF@wYb8|)F-0YPtmJNyltCxs*( zV#IXA^?K>kTcy#GRaFmrd{q8AICZI&aapspJ#L23nop$~pFjb_nUsh7fKtuL)8GI7 z>2B)gap!7R${>=~(#3GGm40FFAVeZ|cw%yfTvKcjx5CMPZN2(*7x;#A2mj~4fB&90 zZ&oioxHl6sF>ARK+XHO46nk(h|6x~BU7^@FSH%Fsmxa~D9XA_bs<|7S-MAG}5; zk6|kP_)Ckxk6EKBwnc7nq3vmIN<0}~K+VsEnM;L$%m#z~o21B(kP(i|f=|G1`7iN) z#ssTc6&V|jGdvm2OTVPgYL^P_k67KG;a+E%>w<^lv^Y8?U>ewTK3{oj{yoyDZ9igc6zU z-oRRv6GYJqrUAs-7IDH2=?`(=7v1CdW%T%j##Ml2Yc`^YU%46z^t%H z7&Hj7n{YB|LvhZ~iOW(X!2zJ)I1DILf;5$D+a`wTa)ch1=rw>3wy_}yBvv=Oqh~md zQ{8HsX~UqXwf8P_kNvb``|cHV#8EYS z5p&cJzx5!3Y=Tb`k8JqP%a?hU)ILeu6nM20b|{hP{RiCV&PklL z8x~MdWL^LVZla(9cb6wpDM!$N2^(mDSM8gb{a-|2vB!SqGH8t%`QB6jmxdiz22deQ zyWTtoK{Fo6iHEU51ChzC?cJx(ez+lrQ$hySngA?l!o=U>`F?^Y60i~&Y;M+QRscs43p8zMYdJHug~8xoGFclPW$rj3(sLWs`S7vp*i{jt-yife zn#S=J56>0bqm}Q6(VBQpG_+=cZ^!<$8Iki~l`B@ahM9&iKs{h&rmlty0L21Y}O=Ep(=H|j5{K#5Hv$SUEpX&N{nM(_PVrAO8qmm9s8Br#zh!v3t(lYZ7)8O`GRpO_r zkv?3w+rgiN?+9EkN*cd%z~C1z8a-N+JzVlvO!5Wh-&0?Ri?PM7>Zox3cJtc-A)ir@ zNm-xF-C9ib;5V3mzZ+9y+gNH}Tf*pNTZy3|+ zBws;APXfJpX7)`7Ds+GnL+4#Dz0oPgk?z*o1NFL#D_FJW1ygFa6CnZrH~zuD7q4r;RdIf!B;*TpAzDWM0w{f{ zgLht0;t#+i$-Nmk{uzLx)V6a)-^d7R%cA~qJCr!*f1~h9LiK4jzh}I|_5Q-Z)AsgV z2KUmEmha{VB&{VaAVb5x+5d4jhFH)?+kuPsumYGzj*WGl5({{7k45^wk~zrBC< zuBVbq-s2x%CwJoYX6#)5g2N624FfL3vw}9FNHdSW5itqs8*AOtDSZ+K~^JF6@_j!DAMvvLOvaV}sYtv;)Vg2b?+?S&l zB6Q80xh|n4T`=o(hb*7J!vBA5|cMadCO;GWJTty+x5tJ`aI|`bUICap9l{JSqM%Wp6}vmE)>tdl9wTmzC2M zjy{usB_&~9GnXrLVQ<$OC&zGv?lo)~BZ?u1vSG zxEn5$$X7%m{bqpey%td`CjD}W7*UWb^pT54g5ATfBD2>IJ6Dp8MW`1W?Y&}O^NRG4 zV%nd)wP?vQn;|Nadc%?J4G}ywrnR^2Y{50aG$KQ<9nD}o*rht_9X^wU*(lh8Pg^7k zfreczO|8(nnTRhNY%vqS^OLEysV7(P^E27vB?_y(KRJ{LE>!PuFR3c_hPQZR=K*-mniw$d z?Ao`lU7)SAz*|`8RHfLhdGr>$jSZ~sX@lDGh(qGQr-NUNl6H)Qr3z&bK8e*Y8%@}v zgK0n7CunpuTkj2bw5(P#E#f#BqV^ERKw?E5FepruU#~bK&F0i^bdaHYL_GOLEQq9* z)Pq31ByAWhf*M1{JW5HFQ4H{+iFU#AvX5gBU8m};@pNfg>2Umde7bV>ZY!+=*g(Yw z@_9N2$}dn+_2Hr0cS(_fVNkJ|1?A8|B&<4geJq0KXy`F(&n4?~7qwsR#Q>mhl0|$B%SG}4 zMFz5-ITorFc?H8in?35*FjcScUvy#ya7sC8dw-ORj<#$A1`+Dms%2e%eB~dV?j=&0 zcA9!jo$Uf8zLm4E47MLl*ZsY);*qHsJqx-XC9Bh39wjkuG!m3Fb1_lr?1<96h5PKlkd znbgdAe62N_4}Zuf{*cG2H_o0DGU`uXhq~Iz zOwW%2?5ek!TXN zaXRXyfN6>w1me<&%HNnC#POsPUsuFq)%tZgsTHI2{QeTN8R@xZgmH{5=MyqIm6(BK z@}r@2m0jZ6H03}WL@;B+r8l)UP5 z?RjW@`^vie%bl1pO%`-=_nfq+2DaSoq2XP)}wwAyKDtWWv-U$m1{ zS>exN0&)w-VGmFJOYVduU}H2He}=n6P+?3>DDv8?Lq)!m4Sa-qlCz?JuIlBZ+@^n2 zYFtmJ({w{+LrISul4M%E+h5`NEn3toq4K-?eQEXM$x9YY;*{ZYM=K3B|JTYuT2RC9 zc6Q~6lRt?v5uT5?HL$FzwPleJ`&cX!pI3svu{a-yQ+;EU{h663XFxdb1^QOt67ogp zLCw(Z{tr$K@AF?D`>}lpfM-#sAsO44?d>5! z+ept!ge8M^5A#^}zcLY8{&HaiDDW=pxH}+%dRTt|YN)aOAl~x?=$ZP!aA~jnzYojGDDXk-|L={LaU=o+5|fb;7g2Y3J8)?0lIlIJ&~iN7a`1Zw zqUAqgOdQ%BJ-3zl-&Gh5NQwi$;*VYPE(^i^bHynjLUDF=)zQ-MKk~?^ueb<466uo58*RTGrjxr@5+1fC(N+ zz(YiFbyi=S(}AEUf{8giRepIji{^brQAz#>+w?T;XXJp#qX}4jIYVADRJ~GFF_K0) z`65W*593y_ytEm@&;=~njpwNW99YR)66&u;=h}H%t6h1IDld9w*;WfnT{ecx6QhLX z;-{$a;lDC>;fesmsZnamu_+SyE+{gabH?)v z-#99Us4W~DVB@o3?HM2{I;to-!g_oMvr6o~T!(4>Y>Ox)Nt46ur|yeVTkO1nvwnij zXA-6e!onsE7I!k_P9T*AhkfNnKB*kx%_I488@LME&9EkcCCmBQ-{OC#hp@|H@RGqZ@4@Xs<{8J=zX$GbMiKEDH7 zNL6mJPkwNQrF^2}ES`-Aq{Oj=6x*$~F@>MP#F_;X3;y93xaj(~g9>U?_z@iV6Ovc} zkm6S=O%P*8Js60w7=EUBcvT=oWGuq*1cr`qagz&5G%$v~ZR+bQN`Br|mi%HP6uzcg zKw}p}MZg0qBSl&i#3u=+5WOTI1*qUWE}?24pf?_M&O6SkjJ`cYso`?Y6(S>kxpVEfgkG|eINYHr5~BJj zOCigEGiRI$bII{@kRtxV?L8g?=y(B z{bUM%W8Z!YYX9$e=j!_%(qB~_5|!yC6n z&AZcmi@U$a+t0*)Ev=p34xNM543@_3yt=gQo7Z}vc1GAC0RSA!@?0L)t-U04Xow{` zCME{hHMZ(jFJ-h<3z4%jn_tM0j^!6?f6OkMNYjWy{GA#UxN|}4*W@b^UInf!XtG%5 zsEtmm*OtcT&G*m^2GzO^%oCc1=9$0kg4#bng z+{<$>)~!9>A$3RxC&B|k*&QbTXrjhBsZ!@ifMHt1jW-b~E0BBPOgArSHX!;qGW=Kx zjgMarv7shlm!SX+&6Qn#xP0|$6c!I5sS_b1Ydzuk3&cxE9T7K$ws~s5omD*~;-BV& z@?ZsB4feCBwc6GZa43+&QuB}2BueN+D8?k~v?OjnPLq5Rxq|)HqpHgJ5uA-G%7Nw8 z@?-UW4=yc@T<-@>G(up9GxW|dX*`14Yl{#8akKZK@0V`}^^0(&pdprv=%KmkhuvWY z(&6KIcJv!O4p&A5OmDNILh1kza)kIz2v*ERek7_mC=TN%co5v?clK2GS#o7Jx7SJ_#BV%j2?2okz4D zQb}^*P?>tt1-n9U`~HQA`oA4YG?;HPj;gbD&~|?dUVOac(fNB_WN17un_kGmUi3xD z+?-Wz|KS=n0{E?CGSqpTIdk4D+E{+g6}&K%-p9F z_U&*1L;sgzp#aFr(UCP{BHi8Yi&5k*B%ryO+f~hh3umK!-zKb#Tjf{UWRXHJP;u4i z-y1ZqT{bHz#l$GBmt{;?OxP}RDcBqZ;N9t2fqus73|O_c*lt|?ENXU@fOQd%CLo1U z-Ofn35guMyf~a5sa!HtoVPp)g_aEA|Ipw>_Vqq^xB-g`rh46?YAB#42!=gWukl{a@ zv-(_15WC`sQ> z*REVRj}J%xraUU^XCn@Ie;wk;Z{UN%vA^ys`MJv*5R6f0JIkHars2IKjIvtK;_^)? zVKVS|_ak!;Bb?QjZVfQY{Gz3a&FIDxW;krp&wA1FFyYT3+>={IHY=g=flrd%HEns( zvG%Oi@VHNm4`Ui~Bdd<^7a!n=h<7ile51U7|=zi#7Ya6X7wu-BcP%Zgn@5Il@&JwgLK2ODU2k)dX%1{*er^U0J-UME zURA9-X8)_PbvJM48#RQNJ0Lqv->}Q?&Zg1Oe)06qsd4l2r1<#xtpr`D6Bx5rE!7Wn z*y$a7=OgTXJpd4T?{9Y*OEpHFT`e7L9W4ms1cPm5K+}!>{DZu$3uqZMC%xe&t+?hf zc*!n(4VG?JZ2gyqfc&TW)~*hHh7^T4@hBz32A6HM&16SysMa@xJ?>`&i1ehY8)Zz9 zNZG<8xKNai@FT9Om<)SPygXR|7`;Y@7Hb%u9fRHsfoxm^0?8DE7AGrQMn{HCYbAcl zJB5)mwz7=yU1pQhc+}C;il)1qi=%@uutkzailowC8vG2d^QXZ1vIlM;r@+2Ur50xc zFZq80vMM$EgA5pg9(WL`w&40iz>eDs1gHE{*hhIJ7blFM~Rk_A5gcP3o zwaC_6^p+MD7Bs$ms~Fw%efhVx`Nl-_sHt(+k=0!9hWqqz>EF@aje~J%u-24RlU|&~ zjNQlb7q_iz?ZQobzA4ICo!fPdBlOjzeLcD_05aLyvX>faVZyqe&%}Kx<=PS;EL&KlrMi&u0!XcG*7**aGl z#)$NZz!3>R7{jUS52t>2Ja*k^ks~5-NsJZh zrMFkxmNOcd(b6<6V&92G+L@a!SI5>@5mTz{DF=XJ#FM>;6~d-038t9I0JO@UWXcL{ zYKqsN-~cFOQ02vL^*q0pKRn~(aI*8Uuy`+9MvJ4)&EvD*KL@0qe>k}qk))7|sT(eY z2habi|1`}qft-v=OVNsknJ;wGnk2RmmBKD%?pcN`Pg0qK1*7@(ap&CCxqWzPR-dnh zYDYPhFRmEAyiytvPQshdur_(ZlXc8;SG-r5TYFik&X;f6O@8wFDV3A-#Y(dNTjr;D z$8v&7{v7ND+`sVhIn3NZYpS)vE9NPoM5Y!fe(Oxx|`a0a(o> zNYTX)BwIAiNYdGE91vgEtL1XBSRRl2?RGo#!*PFT+ga1r2soe3XY={P!^4N4KJ0e~ z=l!g0=ZpFE)zxaX0>Jn0-+%b&23WjzP209jyIHN8rg?aH*lxGOICfoERlcffC>Fzh zAtdKq-PFtFVm6zdPN&^=+xI;ZhQQtFL`1O{)EQoUj(yeaCJ%cqUiphMjKk@0c)0uc zbpLT2I@D8x744*XjZn)fXXBj&c`Ed%j>t|-)2awa0f;a#LtqYJ1VHa7a(I{+1{lX- zyW8z|$F3hw!`Su1>C_>Sb3TO7_g!067nc`J<-7@ z|NfhieKT9EH=FOi{my%M_wKrBoX995m#~Gjskryjp z>YTrO*#7!=--WbcI3{M%d|SD*sf^FC49H4+k5LHVY)%C9L>Dx>oEvD3K~DW}IGv8& zsq2TXABJJ;ZEa z#xW*0D(5Mt=n*)Cz#LCFcaB(a7{=qN-=Dhee%}p2`IyoSPfS&sEyWpz-OHfqJb9-< zkseo+t#Fh>k!;OP+*GB?>iRcr8DsCS!a^};up_G z^&Bl_#mVSI;F%phBbmOMYjkTwvHffgP}rGbS@@A z7-^X=U{T5OnW;Ya=%A)XUAlSX_@Fp*zJyfgf;im{fCa^B&W$+$;;UD$mdnMbyN}!L z?&|7lu~-U-FdHV%)j?Psm!Qmr;hH=tiC$zY30iN~fBi51#na={$J^Vdr^hjjtIc|| z-dtW?vB-M8zPY`*`RV5N=H}hIFW$a=+svB9YSqqX&inTtetLX-JaxyPef3q_wt{$Z zb?NGAx80tOr^Df}S}sEfA%x0%A}VXv;;Z_qnmgCbX3N!T`}EXx-Ovx?Fpk5}bzM7a z=d*cLRZ!>yPVbOK|0NNbE@a%m6^q=pqlwM9#0nGyvF6k%DMkV!tieygAKOVANCHB7 zrkJItm?eb3z=TK+U9x~m`2d8GPlv7_!w`7v`nWU~n@v?$$Kzq_Wwly0brtIY#=zq^ zG6zJg>e`dV3LqI#X{m;`Y!QJ}>m31Psy$K{S!4sE(u$?>;f0(I#McH&sd+?17{_or z9a(rWn^oR}NZjTo0z|mqAC9M9z#opIuZONb)*k-pU;SC-i9k?<$c;gc`(qgTwrS_H z7GQFi9VnJaE2f3|%B@NHr(!=A3y2_z0LFSdJB`D_4$~qrH7S@7(X*I}D2R$0rTkaS zJ6aGlA0g29BM5Xua0hfm&Qay4s$A{80~p5f)b)&h=Bs&Kx3dOh?E8TQK!gC0haB{O1^Vi)^%3!#3^fncJWz>&3H^cnQ-N_FuDT=T&Pj{7fnu z%F#{bq(Zn-%JqGkYAsbNW$_hsGjr24UwrxHZoB_<_v!KR>DBeCwrNJ@qK?E=9;Px9Us3OD zt|(XAu%H7L=ltd6)oQtVe7JxA;m6&6KWo}?90+MKpa1gbzj*ul&9~otb9;Ncxwz8)J?NoEUKzf z?MM=f0E9^1d*_z+)JAWI$K>O8KumjcGDf<&s|&rL}b{S@gCNowrt{lomlW z@K)fMH;!XfRg0zu5Mc(bVs_3Qj;9|#e7Lx{?#6+<^A)^%_m%+W zZ5_gh2+VLe9LK=(wwX0^jN9MR4nc^+i)V)=94P|nm~2B=@jb~lXmdPQn}JzA-QNcm z@-z{cXg8)ERMA*O(h1WED43OCfYUJI7zBVo0Kt3b$azN&g+<1| zi^Za?s##ro!l4i2Fdn;sL0p_-qS#y%6lugEHFfQrADNw?wn0itaZWU#R&@X)f^+1Z zt7~6-?~ulfKe8>(^i>(BDLl$%*Nm_2y~??{={A(yR3$PuDM-!gDPRX(m(Qha(3B?D zL7ti68lqxzCS|# zC4Df#%qU@!6#HE9wMaR{$a8AV(`V=Ev#~v#3oB?eo8DsD#?0{FXK!ZQOtBF5I?t1s zFlAR_6O+vSKiiXOyR`lo2nKCqVL^;;q5=>BMj!%8b)J!$C?cZI3ydim=2hlGP6Uw9 zqn?6mtikyU7nHl+qzruW;)=j(yq>HVDkfWqLIVF8N$*CXmKhy>)Eo^P<#Q# z(ph*CF}hWqbzOJrM{<5XpL?erzXZCjtD6Q9Z|?4Q+rt-M{)zYgn_vI>>hkK#H?Mp} zA{>}S;MDg+KYFTGi`o%}aR7%Yx2j`Ft#<(+%CfrSDD!dHann0Ph{isIARs)qj_SvX$qvCR`Z}kLI7i;__8hixZZ!mQM zg%@}Zh^)%ns5KkJ3-6vBk5+%m^IK`;fJH&ui*(eB?)i^^q#T?*V|QN63Z+LYt@ydr zp?#uFH;TR7&mQr7w2(QEwA`xFv7k0hRtaSa7AnrA=J8OYYZd-;@U7cp&u)@Yul_+P zk@AokEQfxc3Ow^`s^EOy!t^B=gc!qJ$nTr(S#&W^0c-SD1^JYlKxQt_5RrzGS{#0Vh8~d zudlAxtIge~+wZ>r=JN7-wORqjyqf~5C>(5^vx?bKb19DWUL`k}2mI5rJZ&jtC{Thf)k~a$^8UQXxxjq?tk)!?CD2H9MpM z48#NxVDQems81^A#CDP+$QbI%&1SQ0pPqk?bA;c7Oh$RZqfJP5_*j@uU;QPb4XM$}cU>_DcR0nrf(LtRx42}Fh=4CB~$ z{V=lk&U=@}jKD0zIF2F26UFNaJfZh));6c6ZkxKPtF9mOY0b(LW)@G?CM^r*+Jh2X ziFJ%iCfeFX<~h+j>LMsGjiRO595fX}$Ut^taBXk~J(Sr~NCYTIm^(P+yrgM2zJMe| z#6CjQN*znVW45SDV`WriOqC6o%0<_Ccuq@Ldh`W@c1Ffz=Du`~lg5tx zN+^J5<0*f6eogUC${oB!MZEYGTMK)}i|DG{^-zwZIGFJB6+-2s4GW1-RNP`JH54(` zFOdzz11bQ44V@Wg`h4$)G93k$HAr~FPE5-xW(r~%I()X!=d2lmX4^3Z@%pq$Q^VZi zB#$^ro3XZ_d5m%ofvTah)ar2bt&DuL{Za8jC>UEDXZAcpT;(_*#U~Urj6e;)UdF^-5;N7T7TTq&~z7LJt7 zkKcd)@#9U`_p|w8wO(FdUsV8vR9E%m_UXg>50S=bXER}$&1UVa-EMcg-R^Ka?)Uq{ zdc9b!7mKAM0^w4L5YanFO(P&p+n(y$JGXs$+5wE?cy)C}&Y>Da);_;dtjzNuph%@5 zB05(Qk|1&_1>xwr1VlhcfxW~dYhr&R)Z~NdSjr*=5W;kTVPahcHOv42@G6fYCTmgb z5uKyeYAFKEtgU>7aqXDL5QZ?KfOjs|#>dl3BTIr9H*IV9sH>?*yOn&&iI>P(VYvB+_M3S(%RwyJ$p1MjP$A6S??e*4`Ihf_F(UER+2hyB~P zue;;n)%9gnISCv)s~`4z5t+4Z7102Xkx@z{NJ50gSqZ8LMWQgSatI=p%HzQCM3_&H z+h70VAO7K+_lGVZRZ7H3amJ$Y5K@vWR8V%3VStK|ByLKJ?*t%sU&NvqPRT_8LSj2%iWg1wakMatW{eTwh%JjxY@tyM^iZ)XDJpd4vI3TJVi-fd&HIGgJ zkSFh$GzHFo3SO@K6rhl|vq9N4=FN?HDy=2hY>2+gq@&}68WG5ZVhIF_nV8tjKk|bb zUrg>bO$|TCKqY!O<80CmbwemgaZ7{61p`+I)+B3jR&t}EV!`$lNIBOMagtCL$upr8 z`SVP!v70ZgYDU2EDI$dpQ6^-91C{R*6*);w>EfgEG^QT8nkZ+0cu<64Ks2K*$y-RQ zR%8p1QZR_1j8!ft*2To!>{snpQ7>X)WBiQ}5gj>~`bxx!il>{U6775n~XwQm3H&tJWIHT1*7r%&I0{fBq& zzG&N-^Zw1-w~OWcaNIvU+_!DD-EJlDYPG7?>$+{)y7_o_*Z2K?w|{(mT+CA}Zyt%!7{p$5{wVbzYtj#Kah)4h&0k&=Bz4QL*>8bDg{eE9J%{UBI zQ&&}uTK}A8y@<)mDpMpF z+bByidSu<;HLi~kEaIotYQcgO3%)_Z7&rt5AR-@giz;y#xm-pRR;VBeU;w1yN$lU1 z5h$lJrVtf@MXVnx796iAosbY00So8qNJ13ox}oa_U-`vyiG;Dq1(3VDfBbm+@!gkS zJl)+NPd$(y$MJW+`~BtR>h-Hl-tmIRdwCeHKq*q86U1RVJ7AP@hnKl zb)%A)IAH-6*dO{oeE-wm{r1}rpPm>UQ3aYMH@ZQ}@O=_Amxv)&|D11WE}&CZF|)hz zkFnS;nUcIyEJ4{!kpKuFi-f=-jAIx8Do02F&N79GCUHmHSU8AlF0j)9p4K!$M? z0T;Y?3@pIFEW)Tfim$*mOV7fQM9}-3|4yOlv&68 zN+s|z=goQTie)HNjUks~zX%|7EmEE5M32rCb%O5FOX>Jx)kP$Bat)7g3}h5ci^OnZ zLemvUnyrn#KGA9+Z2(Ha7K{f(U@+-W9R-kp?RCdRN|4wTCi%7sj|9%Yo#m~OHzPws2U!S_w za=9RKyLbrB!^3jDTCG;EU%y_iR>Lp^4*UK7>G5&shs|cww9R_Gn$2c)Ro#F3^mzYC z!Zkl`Qdm(@?U-R)ptMq`0m}??s)j( z-5U-)3lUL2^rvG-&MlVfboG1xu78xS*+BS9N$wUxD#-W#(aP&TI-eBRt95?`=AcnxhIQqH?0znu7 zyM8zg{i*MUeoPjvbc?AK1jU9aT*PCgam-jpXEKq5(LP#5s3aGa_*>;sz@j_Kq=8u| z*2I}H5Cx3Lg&R7Lh{Zac?W;duJ|!+Qzoufrxy{lu`bIAM>fZ%BDbH*xBq)^JXMFrEz z&{q>k-2*k2NE8Y^W0jN&*R_n-+2dTE-{iC`jX+4OjbsFh?7Oj{X|Bn}fFh}6K>7LX zgCpmVNFfkmm*XE&;Y<9oW?U75X^55{sKl5SSyPIpi-j>b7UP!qAXk_OeHjP3cU2|a zq=ZwzQP4|eZ~_1n@o2(GXfcsPXX!uNUtO@uQW(@|P9Xu*taRBLNrFZsx*Hip97g0r z#t;x95@6m2o&&GAnkHnzoU*o(A#x!Y=2p{qDD6Tf03<}O3s8JjseVTOP>-GEh@4xxx``KbKYufRtTVJfMuCF<;^T+MuTs%S$IK-Yo z<{Oh*#jvSexG+T%QdYVBA(LtFB+tZbdV~W~i!*=uQ+B=w8!q_th)Ye}SoHH{; zoS|jCL;^9TD(D0x?XqIf!veu5Eejcm#DvSj#k|)cnL^Tv-8|%UIWY6-)HO|8*Iqz? zQ^GtjJLkq>+@Fq*+noU4-rg*itJl|;uP#@xS&ZZ0$T7?DbPOEYwyo+ap0AA)M_{H# zd4OaYStHA&%bxDhjdDaC>6G zm2y|W5aG5~2o?Sp3T@ZVi+Z1YS?LIwPhI!;gyYD&W9J>jiVx0(59uk6T-&y*MZ22M zymx>?4hdWZjX62zJrV&TYwELd9@?gn##a>*ioh@ohf}vdcKhS$)c3h@iryp!rOr7- zA#&q5a*$ksq*YQjhnh*0T;q`nEGW;A)>NGV6-*?t3Y$gkP};)Ov{0ld#DfBn6dTbq zqJ2iZ6ftdvYvrQnFJhWOd&RtDIq;Ia;*#a6*u$+akw}{C1X9YzwlLtND! zLsDQRdgB=4Ycr0bTFYoW%Z7t?%Fr>Rv&}9F4Y6>oM#X~NE*E2@2_#D;JDLN5y7y&T?vV_FFiUwk$tSzBd zrp1~U6JgE_AONBeAxP}~XQk@s)rXcqK7N8WDH9FMq;mSiJ2&pPH^2YG&)&Wrg_qY? z`(d0l%@9I7>NQ>#0#{Y__U#vk!{O82r`>jUb#>LYZ9MSK7Dl~`nYnD&V$c>FT^knG zfn+6XX6-M2`ODRMGcupL)9uZN{o!zRebu(J#bWU%KmSGFbsukUA0HmQuP(1HiO{2e z{p!_bwf=Z}b9?*o>1n%OucP%}Zr1H$(RW=4;jrKD_j@8*E|+nsy!SRA@#(Skc}!Ok z(dlp;hW@ZSIC8Vu4Bgb4PSKTlsaT}qT}l&10pkcYwVGYsEh!4YoZgFqrHjXrv6Wan z6psiN(xn!OzA{-iPDLIH!4ME22=F*^U_hySY(Sb?^s7D^J;Bgo)FE{Jua_BoE zbdI{N>$;(;{bIIs2r*MR!7+vN0zk`(L)L6mkP|0APPN2jc{hZw-~aTVe*K#tZ+8I* z$zfWAc#>}hPg)017>T^rPz)lM1;kKkLb+hp>TClnzhC-9O92#rniPWQKl^Tc3dd6) zwue)sNn;bylI#!w=V&>f_rnlEn70i83?T&F-x%*c4g&`qLrD4Ikbo8<@EAlmjIiGy zA0D5cw!6cr?}m^Xlwdabzyb~g;(>8CSUsyAawv$(LPe98F>_(>(i~`dN~bV(ohzn7 z6*VRTGKSD_(5_MWFgei!n{ryGfXmrinaz&HcCoLAC`}R5fKf+KVzmn82JSk#!t_TA z%q9j&D=g=o=EN9R&Gdl?x#%^4DCTjHoU;Wm2HyrwQ|F+0z+(0+1(C%v)dPTHP(W}* zk>D)w<M8Vy zOiZMGu}v~DP3A!36Nt0@jF>forX+F}*&_N_bZZB>h`whuH(3cey>}dO(q-jVBTkHG zQrHnTke<#15e{qAuGh zR7QYu?kEj5`o!ooNJ=y)0_fr|m?u8LR3vl=C=kTOsfs6g2_h?gMx>a3NEyPo!YsvW z2_eMe-!#Tm3L4Po7tk?Vz?WW0p<+>_kkO2YI7hcX-CS=r`Bb>+PeAz0hV^fF0kkpx+>gCdD&ZPH=# zdituMl`}fLetpf%eczAa^~1x%c6)g9=Jn=cJ)6&F^I6k0A3uH^hk?)u0|Ait-c>*Q z>Z^;(%f9dThkY2s{lmk><;7;Rna}6U?1(}Lhr1sC+nPnWq7y<#1Lvn~j5`B77Sx{zGl-ZUdxGi55AvI`#xXKCC=_G`} zjwmIw!4O-zI+^FfIa!4-A&en_Kvnr9`UPfB?Tm;3=`-?fuh#`upGh!?z!f9g}lpm^j9h z%E=ogQ2HeM#b%KqTPVW~=G-$aKg}LZy7HI{fywKY-%?L#ONXOK7{-1Kc#7qHIoO08 z>;e&<`mrB|W7jX+#yb}{u&`o_1e#-Ok1}-$aghjPt?2RCZ4amYq3Z`u2i%$IQ2?vV zD`)$w@1=zznX55>6oEkE^VO!sh)#0ZO0syQfk&aaT6~g%BgHDYIadlNQb}Z*8;Kc- zQsy;rdFDsddy(QFh16O&faNP;-sxeBMg>p+0n}C&dZ3daO-=_;8H+k^?N1SXOn@X_ zCr&RFYoisH#b6N*XKL;_e`0;w!UD@YS-mKua)0xs!#vIdX{AR^FRX6C$f zO4IS-Ib6Ynf^?xoPf4_fb(0c&Aas&ZM;c#*($QE-LMRap#|)X`yZA)H`~nieZ$h~k z59YFZD65mALJkaRBiAW?+Of?$SWP~iD zwQUhGL67z$0%ifC7z)K1jycOXRsp7zUlP>`)IcSfECU2O`1s{y5;OBNv419_R^OSF zQEMn|e}JNA)FKAU;u^Z=z(7PKs$WQ02>^27WY$<92(#KtFVfGG{6N`5JPnZ0`e@lpMuFgw7gy_gIs3&g{`Bwu?Z5r!|KtDg&38Y#k=MWa zi|rUx&0<;1o7{_rK#)td+!)`a6x^^~e z+IBvhRh94iA&ldGzaNHC1lOB&Q+w~?R<#6b5fIRM2ad>*tE(CjV?}%tj)J=~sG8m` zX4)~HHA13=M8J$^9?@zvKm-IO=ch}jnfqF)P9W%^#L3XG-T^Gf9|U8EcVQ+XM?@4& zR3g;CUO0M?ZpTmPpoo3C&04?>Q7mDb*fyt%~vJ0fK)Oj;G*9_ z^)cya2Tblg|0hX^R&_-YB@z=Iv;q>ul&R59p`v~^5m2T1RSzy!Dx{)77R!R5q8J#%=#q*j1iugk(I>GA% z->oWC-y47^b?D3ZO#A8Q0HD}Gx$6+dOa5K}^2^L$aNOEJ)`{e>!|*u}`WWY8cJI*`KcNxE~oloJ^$wvpz5 zr1;STg(h8CZJwqEO+A8|qQF7GReETNcZ5W~*c2!t!GNAH#yu6eFC&gD1M?Vo3?hL6 zgoGqJ_Vi$H9^FP$q>5GjKojLz74j?u=5{u_`TPI3`@?Vk`oH^^-!}d?|KUIX>Tmw# zKm5o4aIv|VzkPccMnqy=)i?zq1R{F%>ecCVy1&2Q?RJ-!m&^G=Ad$lWQtYfEO<5%Y zOpr~*Y!U=Qb}#_oox8laXzJ$a>GAIFw(p18tX(V?uiw0B+ty+uvmK5QtIB)ty#M*n zf4<#r_lLvd)6=V0ud1qYzFJh(IEzzYh)(MzycyEORWve(27`#s5@09XdWtcii&zhsTXN7 zc$AWmBI6L^+I#PaC{ssg6=MQ~E(jk_r^@@fs)F$2{r2wuap;G|V)6RT)vWP37pN7l zCdX+)%!N!06Bshn*f&iSC5s|}63eC1sR1AmS%t(h3xI?$&gQd!vRZKnfZ&k2({Sqh zy7u$Mj6j%2%qG+NMHsTSbqF)^Z)(B*WbOr>jIFkBqcT( zP}Izm;bArF30cOo@KCFgW9*CM0JJgzAY>mGPij^akdCOz2Gy*UIys%mvvgr$!;Eb} zO(&okf;0o73|8sPl7e>q7=mw~66U33P-prZc9mp2n8_yunJB?m(JAvN{(ur>~%D$|q=Q z(pU$}{ZSNe6KVsR=1z>P)PUH;EshGU7&PKCOxb97hT&fLeTu6Je=vn*W=a%ql;157 z@PwI5VVhVp4yAwzbR&qGtukvYEJzfKQ?0ho*fs&NMg|l8z|;>p()a`#ZDLwz)gn!e z<)XMmk}0uT$iaCZ*mNNzU!*7ACv^Y>@M!)b4hFo**rM^)u2ht46!x(z`9Wc7F$T}ndhDVaC~ z>Bi9aOo%?|vhpN`f<3z3`}g5Dzx^*i-Tvx- z`Ckva;}2i|;pbnz`~AQBzyIog``?GEV%9pe>dRMQSaj+TNM z#9HCR9WWq)Wegz}{drdrxd`);{7=wqjCQFX`R4Za@$vCzU;Rlp!uQ{OfA{fIKMe7_ z=d1Udzy9ZcwOF($0R^MIPrm^%9V&{g`X+z1S{Q7K`9Fd3Cs|J+;0#6<@ewI zLVpxmg&K zmT5s%Fj5OUvbob@s-kfZ!9SqRDzh&fqG0S@S`ndM_n-(`$7CCzj0& zJx=YaxrIF1Jks>;Q)gTx6NKN4agZ^eV1E~DL#quiq7MQE{1^*7N*2)2iPez- zV6s{O032fvGSY)nJ(X%-q_-wj;Hp0o?QAZ+*K7c28B;ba8YP)bStEb~8B7W7<%VESR!66H7mAZ}pxHCCRQ z%FUXpu6*Udk+?KJ5fc-|WG+fdc_Dzv$Ya-s!*O`rcTb0Ycj^P{f!Sty06Zw7B5RDM z2t|=;X&+FDL`uj;0FkKn)GpgMU(ILD-~T`V{;&S~|LH&eyMO=s-5c(@yWjld>aYL$ zaTv_LfCAe{rZEemEauC$oj*N2-QL_Rmdnj%lN^Ips!SHYU~6MFqHd7^Z4sBTW7eE^jopauM=Umga<2ZJw)8oU#L*UKD z#pU&NJD>Zec6C)Z&0)Xa?RJO#e!X5VSIf#*NaQHCfr`!p%ZWde168;jX{LS)L?WCJ zgX)m2NlYZ9lr|}MhNVp^7)MPysK(}iHMUk05Os=iU#oN8SKYV%w@>Dk>5P1tkik(D5wrp^A&FycNm+SQQIkqs4%EJgFKZTn7u_Ui&QntCN427 z1*bwP`BWIwR9lS{VHP2UL^b8s1r~Lc#&^Q9Cmun&*9sd6T6*4M-31h1%+xYOp+YKdL^r3v3r8LhzNw5dehiK!I#y; zr|lJIbRFt`qP%q;5HapZg2HR$tY9W`bmxEEaUPXWtO`G&JO-emF_&n+9>_#j5<``D z*65=!P@++XwXxKc^%-kr*8N3PWI*aUx|#@;ydVsjq*N~L>?=}Cd0>u~r}l1ES8Y?Z zwTnkjq%;{K3ix!cN~W)ggqcsL@rh0#FtT)G;9)GOvUvIb4^zD3(QPGXK>z>%07*qo IM6N<$f~%PdQ~&?~ literal 0 HcmV?d00001 diff --git a/examples/bluetooth/ble_uart_service/main/main.c b/examples/bluetooth/ble_uart_service/main/main.c index 71cd8c506ab..0726b9efde5 100644 --- a/examples/bluetooth/ble_uart_service/main/main.c +++ b/examples/bluetooth/ble_uart_service/main/main.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: Unlicense OR CC0-1.0 * - * BLE UART Service example. Backend (NimBLE / Bluedroid) is picked + * ESP-BLE-UART example. Backend (NimBLE / Bluedroid) is picked * by the host-stack Kconfig at compile time. Whatever the central * writes to the RX characteristic is echoed back over TX. */ diff --git a/examples/bluetooth/common/ble_uart/Kconfig b/examples/bluetooth/common/ble_uart/Kconfig index 433d629fcc9..276e7bdd90a 100644 --- a/examples/bluetooth/common/ble_uart/Kconfig +++ b/examples/bluetooth/common/ble_uart/Kconfig @@ -1,4 +1,4 @@ -menu "BLE UART library" +menu "ESP-BLE-UART library" config BLE_UART_DEVICE_NAME_PREFIX string "BLE device name prefix" diff --git a/examples/bluetooth/common/ble_uart/PORTING.md b/examples/bluetooth/common/ble_uart/PORTING.md index 1d3cbe8a9c2..e090f31a13f 100644 --- a/examples/bluetooth/common/ble_uart/PORTING.md +++ b/examples/bluetooth/common/ble_uart/PORTING.md @@ -1,4 +1,6 @@ -# BLE UART Porting & API Guide +# ESP-BLE-UART Porting & API Guide + +> **Naming convention:** Use **ESP-BLE-UART** for Espressif-owned product names (Bridge, Console, Daemon, Echo Server, the `ble_uart` component, and the `ble_uart_service` example). Use **BLE UART** for the generic GATT service convention, transport layer, and compatible third-party devices. This follows the same pattern as ESP-BLE-MESH. This document lives in **`examples/bluetooth/common/ble_uart/`** next to the `ble_uart` component sources (`ble_uart.h`, backend `.c` files). @@ -60,7 +62,7 @@ is entirely up to you**. Canonical sources live under **`$IDF_PATH/examples/bluetooth/common/ble_uart/`** (component name `ble_uart`): `ble_uart.h`, `ble_uart_nimble.c`, `ble_uart_bluedroid.c`, `CMakeLists.txt`, and `Kconfig` (prefix + RX scratch; -`menuconfig → Component configuration → BLE UART library`). When reusing +`menuconfig → Component configuration → ESP-BLE-UART library`). When reusing outside this tree, copy the whole `common/ble_uart/` directory or at least merge `Kconfig` into your component so the same `CONFIG_BLE_UART_*` symbols exist. @@ -73,7 +75,7 @@ then use `REQUIRES ble_uart` from `main/CMakeLists.txt` (see `ble_uart` target exists when CMake expands `main`'s requirements. Kconfig options appear under -`menuconfig → Component configuration → BLE UART library`. +`menuconfig → Component configuration → ESP-BLE-UART library`. > A `main/idf_component.yml` path dependency alone is **not** sufficient if > `main/CMakeLists.txt` lists `REQUIRES ble_uart`: the early requirement scan @@ -212,7 +214,7 @@ void app_main(void) } ESP_ERROR_CHECK(err); - /* 2. Bring up BLE UART */ + /* 2. Bring up ESP-BLE-UART */ ESP_ERROR_CHECK(ble_uart_install(&(ble_uart_config_t){ .encrypted = true, .device_name = "MyDevice", @@ -489,7 +491,7 @@ ble_uart_open(); ### 6.4 Configuring the device-name prefix via Kconfig If you use the shared `ble_uart` component, options are already in -`menuconfig → Component configuration → BLE UART library`. If you copied only +`menuconfig → Component configuration → ESP-BLE-UART library`. If you copied only the `.c` / `.h` files into `main/`, copy `Kconfig` from `common/ble_uart/` as well (or merge its symbols into your own `Kconfig.projbuild`), then: @@ -505,7 +507,7 @@ ble_uart_install(&(ble_uart_config_t){ }); ``` -Edit the default through `menuconfig → Component configuration → BLE UART +Edit the default through `menuconfig → Component configuration → ESP-BLE-UART library → BLE device name prefix`. ### 6.5 Pushing data proactively diff --git a/examples/bluetooth/common/ble_uart/ble_uart.h b/examples/bluetooth/common/ble_uart/ble_uart.h index 6388252e1aa..584c0ac9eb3 100644 --- a/examples/bluetooth/common/ble_uart/ble_uart.h +++ b/examples/bluetooth/common/ble_uart/ble_uart.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: Unlicense OR CC0-1.0 * - * BLE UART — turnkey serial-over-BLE peripheral. + * ESP-BLE-UART — turnkey serial-over-BLE peripheral. * * Implements the de-facto BLE UART-over-GATT layout (RX write, TX notify; * fixed 128-bit UUIDs below) on top of either NimBLE or Bluedroid; the @@ -101,7 +101,7 @@ int ble_uart_install(const ble_uart_config_t *cfg); * Bluedroid: triggers adv-data + scan-response config; advertising * begins once the stack acknowledges both. * - * Returns immediately; the BLE UART then runs autonomously + * Returns immediately; the ESP-BLE-UART then runs autonomously * (connect, pairing, passkey display, RX delivery all via internal * callbacks). Single-shot. */ int ble_uart_open(void); diff --git a/examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c b/examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c index 26b41ac585a..8e09ac6cc4d 100644 --- a/examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c +++ b/examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: Unlicense OR CC0-1.0 * - * BLE UART — Bluedroid backend. Implements the lifecycle declared in + * ESP-BLE-UART — Bluedroid backend. Implements the lifecycle declared in * ble_uart.h on top of the Bluedroid host using the service-table API * (esp_ble_gatts_create_attr_tab). Active when * CONFIG_BT_BLUEDROID_ENABLED=y; otherwise ble_uart_nimble.c is used. diff --git a/examples/bluetooth/common/ble_uart/ble_uart_nimble.c b/examples/bluetooth/common/ble_uart/ble_uart_nimble.c index c59698f09a2..c1c515c51f6 100644 --- a/examples/bluetooth/common/ble_uart/ble_uart_nimble.c +++ b/examples/bluetooth/common/ble_uart/ble_uart_nimble.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: Unlicense OR CC0-1.0 * - * BLE UART — NimBLE backend. Implements the lifecycle declared in + * ESP-BLE-UART — NimBLE backend. Implements the lifecycle declared in * ble_uart.h on top of the NimBLE host. Active when * CONFIG_BT_NIMBLE_ENABLED=y; otherwise ble_uart_bluedroid.c is used. */ @@ -80,7 +80,7 @@ static const ble_uuid128_t s_chr_tx_uuid = BLE_UUID128_INIT(NUS_TX_BYTES); /* ===== State =========================================================== */ -/* RX scratch capacity. Tunable via menuconfig (Component config → BLE UART +/* RX scratch capacity. Tunable via menuconfig (Component config → ESP-BLE-UART * library); fall * back to 1024 if CONFIG_BLE_UART_RX_SCRATCH_SIZE is absent. */ #ifndef CONFIG_BLE_UART_RX_SCRATCH_SIZE diff --git a/tools/ble/ble_uart_bridge/README.md b/tools/ble/ble_uart_bridge/README.md index d4a514b1693..a539e757b06 100644 --- a/tools/ble/ble_uart_bridge/README.md +++ b/tools/ble/ble_uart_bridge/README.md @@ -1,9 +1,11 @@ -# BLE UART Bridge +# ESP-BLE-UART Bridge -BLE UART Bridge is a host-side utility for talking to ESP-IDF applications that expose a BLE UART-style GATT service. It provides a reusable Python transport layer, an interactive console for manual testing, and a daemon mode for simple local IPC request/response workflows. +ESP-BLE-UART Bridge is a host-side utility for talking to ESP-IDF applications that expose a BLE UART-style GATT service. It provides a reusable Python transport layer, an interactive console for manual testing, and a daemon mode for simple local IPC request/response workflows. + +> **Naming convention:** Use **ESP-BLE-UART** for Espressif-owned product names (Bridge, Console, Daemon, Echo Server, the `ble_uart` component, and the `ble_uart_service` example). Use **BLE UART** for the generic GATT service convention, transport layer, and compatible third-party devices. This follows the same pattern as ESP-BLE-MESH. ## Table of contents @@ -26,7 +28,7 @@ BLE UART Bridge is a host-side utility for talking to ESP-IDF applications that ## Quick Start -You can reuse the ESP-IDF Python environment, or use your own Python virtual environment. If you reuse the ESP-IDF environment, export it first and then install the additional BLE UART Bridge dependencies: +You can reuse the ESP-IDF Python environment, or use your own Python virtual environment. If you reuse the ESP-IDF environment, export it first and then install the additional ESP-BLE-UART Bridge dependencies: ```bash cd $IDF_PATH @@ -56,15 +58,15 @@ Check whether the device can be connected: python main.py connection-check DEVICE_ID ``` -Open an interactive BLE UART Console: +Open an interactive ESP-BLE-UART Console: ```bash python main.py console DEVICE_ID ``` -For Console options such as line endings, hex mode, and write-with-response, see [Quick-Start-BLE-UART-Console.md](docs/Quick-Start-BLE-UART-Console.md). If you need firmware to test against, use the [BLE UART Service example](../../../examples/bluetooth/ble_uart_service) as an Echo Server: it advertises the default BLE UART-over-GATT UUIDs and echoes RX writes back through TX notifications. +For Console options such as line endings, hex mode, and write-with-response, see [Quick-Start-BLE-UART-Console.md](docs/Quick-Start-BLE-UART-Console.md). If you need firmware to test against, use the [ESP-BLE-UART example](../../../examples/bluetooth/ble_uart_service) as an Echo Server: it advertises the default BLE UART-over-GATT UUIDs and echoes RX writes back through TX notifications. -Run the BLE UART Daemon: +Run the ESP-BLE-UART Daemon: ```bash python main.py daemon DEVICE_ID @@ -111,7 +113,7 @@ python main.py daemon-notify DATA ### Typical Console workflow -Use Console when you want to manually test a BLE UART device from a terminal UI. For a known-compatible target, build and flash the [BLE UART Service example](../../../examples/bluetooth/ble_uart_service), which acts as an Echo Server for Console smoke tests: +Use Console when you want to manually test a BLE UART device from a terminal UI. For a known-compatible target, build and flash the [ESP-BLE-UART example](../../../examples/bluetooth/ble_uart_service), which acts as an Echo Server for Console smoke tests: ```bash python main.py list-devices @@ -194,7 +196,7 @@ Main responsibilities: - Connect and disconnect with a BLE UART GATT profile. - Subscribe to device-to-host notifications. - Send host-to-device data as `str`, `bytes`, or `bytearray`. -- Support a default BLE-UART UUID profile and user-defined BLE UART profiles. +- Support a default BLE UART UUID profile and user-defined BLE UART profiles. Important APIs: @@ -241,10 +243,10 @@ By default, the daemon binds to `127.0.0.1`. Keep it on a loopback address unles ## Demos -The `demos/` directory contains example integrations that build on BLE UART +The `demos/` directory contains example integrations that build on ESP-BLE-UART Bridge components. -- [BLE UART Bridge Demo - OpenCode Integration](demos/opencode/README.md) shows +- [ESP-BLE-UART Bridge Demo - OpenCode Integration](demos/opencode/README.md) shows how an OpenCode plugin can forward session status and permission requests to a BLE device through the daemon. It also includes a firmware-side protocol reference for devices, such as the planned `esp-vocat` / MiaoBan (喵伴) @@ -294,6 +296,6 @@ The tool depends on: - [Quick-Start-BLE-UART-Console.md](docs/Quick-Start-BLE-UART-Console.md) - [Quick-Start-BLE-UART-Daemon.md](docs/Quick-Start-BLE-UART-Daemon.md) -- [BLE UART Bridge Demo - OpenCode Integration](demos/opencode/README.md) +- [ESP-BLE-UART Bridge Demo - OpenCode Integration](demos/opencode/README.md) - [Profile-Compatibility.md](docs/Profile-Compatibility.md) - [PORTING.md](docs/PORTING.md) diff --git a/tools/ble/ble_uart_bridge/demos/opencode/README.md b/tools/ble/ble_uart_bridge/demos/opencode/README.md index 92347e448a4..240657681d6 100644 --- a/tools/ble/ble_uart_bridge/demos/opencode/README.md +++ b/tools/ble/ble_uart_bridge/demos/opencode/README.md @@ -1,4 +1,4 @@ -# BLE UART Bridge Demo - OpenCode Integration +# ESP-BLE-UART Bridge Demo - OpenCode Integration This demo sketches how to bridge OpenCode events to a BLE device through `tools/ble/ble_uart_bridge`. @@ -12,7 +12,7 @@ device decisions, and daemon-side protocol handling for their own products. - [Goal](#goal) - [Quick Start](#quick-start) -- [How it relates to BLE UART Bridge](#how-it-relates-to-ble-uart-bridge) +- [How it relates to ESP-BLE-UART Bridge](#how-it-relates-to-esp-ble-uart-bridge) - [Daemon JSONL protocol summary](#daemon-jsonl-protocol-summary) - [Files](#files) - [Demo and customization notes](#demo-and-customization-notes) @@ -40,7 +40,7 @@ Use an OpenCode plugin to: flowchart LR OC[OpenCode] -->|session.status| Plugin[OpenCode BLE plugin] OC -->|permission.asked| Plugin - Plugin -->|POST /notify| Daemon[ble_uart_bridge daemon] + Plugin -->|POST /notify| Daemon[ESP-BLE-UART Daemon] Plugin -->|POST /request| Daemon Daemon -->|BLE UART JSONL| Device[BLE device UI] Device -->|once / reject| Daemon @@ -52,10 +52,13 @@ flowchart LR 1. Prepare a BLE device firmware example. - The intended firmware companion is an `esp-vocat` example for the MiaoBan - (喵伴) device, planned for the `esp-iot-solution` repository. Until that - example is available, use any device that implements the default BLE UART-over-GATT UUIDs and - the JSONL request/response envelope described in + The intended firmware companion is the `esp-vocat` example for the MiaoBan + (喵伴) device, available in the + [esp-iot-solution](https://github.com/espressif/esp-iot-solution) repository + at `examples/bluetooth/ble_uart_service`. See the example README for + supported boards, dependency versions, and build instructions. Alternatively, + use any device that implements the default BLE UART-over-GATT UUIDs and the + JSONL request/response envelope described in [Firmware protocol reference](#firmware-protocol-reference). 2. Install the bridge dependencies: @@ -64,7 +67,7 @@ flowchart LR python -m pip install -r tools/ble/ble_uart_bridge/requirements.txt ``` -3. Start the BLE UART daemon: +3. Start the ESP-BLE-UART Daemon: ```bash python tools/ble/ble_uart_bridge/main.py list-devices @@ -152,14 +155,15 @@ flowchart LR should receive a `permission.request` JSONL message and return `once` or `reject`. -After the `esp-vocat` example is published in `esp-iot-solution`, this section -should be updated with the exact example path, build/flash commands, and any -MiaoBan-specific button or display behavior. +The `esp-vocat` example is available in the +[esp-iot-solution](https://github.com/espressif/esp-iot-solution) repository at +`examples/bluetooth/ble_uart_service`. See the example README for build/flash +commands, dependency versions, and MiaoBan-specific button and display behavior. -## How it relates to BLE UART Bridge +## How it relates to ESP-BLE-UART Bridge The OpenCode plugin does not talk to BLE directly. It sends local HTTP requests -to the BLE UART Bridge daemon, and the daemon keeps the BLE connection open for +to the ESP-BLE-UART Daemon, and the Daemon keeps the BLE connection open for the plugin: - `POST /notify` sends fire-and-forget events, such as session status updates. @@ -170,8 +174,8 @@ the plugin: For the daemon itself, see: -- [BLE UART Bridge README](../../README.md) -- [BLE UART Daemon Quick Start](../../docs/Quick-Start-BLE-UART-Daemon.md) +- [ESP-BLE-UART Bridge README](../../README.md) +- [ESP-BLE-UART Daemon Quick Start](../../docs/Quick-Start-BLE-UART-Daemon.md) ### Daemon JSONL protocol summary @@ -201,7 +205,7 @@ are documented below in [Firmware protocol reference](#firmware-protocol-referen ## Files - `src/opencode-ble-uart-bridge.ts` — OpenCode plugin entry point using `/notify` for status and `/request` for permission decisions. -- `src/*.ts` helper modules — typed, commented demo code for payloads, BLE daemon transport, OpenCode replies, and permission queue handling. +- `src/*.ts` helper modules — typed, commented demo code for payloads, ESP-BLE-UART Daemon transport, OpenCode replies, and permission queue handling. - `opencode.json.example` — example OpenCode config to load the plugin and ask for permissions. ## Demo and customization notes @@ -224,7 +228,7 @@ permission requests can be approved once with `once` or denied with `reject`. ## Environment variables -- `OPENCODE_BLE_DAEMON_URL`: BLE daemon base URL. Defaults to +- `OPENCODE_BLE_DAEMON_URL`: ESP-BLE-UART Daemon base URL. Defaults to `http://127.0.0.1:8888`. - `OPENCODE_BLE_DECISION_TIMEOUT_SECONDS`: permission decision timeout in seconds. Defaults to `60`; set it to a positive number. @@ -232,9 +236,9 @@ permission requests can be approved once with `once` or denied with `reject`. ## Current assumptions -- The BLE daemon endpoint is configured by `OPENCODE_BLE_DAEMON_URL`, defaulting +- The ESP-BLE-UART Daemon endpoint is configured by `OPENCODE_BLE_DAEMON_URL`, defaulting to `http://127.0.0.1:8888`. -- The BLE daemon supports both `POST /notify` and `POST /request`. +- The ESP-BLE-UART Daemon supports both `POST /notify` and `POST /request`. - The BLE device implements the default BLE UART-over-GATT UUID layout. - The BLE device understands JSON messages described in [Firmware protocol reference](#firmware-protocol-reference). @@ -247,7 +251,7 @@ permission requests can be approved once with `once` or denied with `reject`. - The plugin checks daemon `/status` to maintain a connected, degraded, or disabled BLE forwarding state. State changes are reported with OpenCode TUI notifications when `client.tui.showToast` is available. -- If BLE forwarding is disabled or the BLE daemon cannot return a permission +- If BLE forwarding is disabled or the ESP-BLE-UART Daemon cannot return a permission decision, the plugin replies `reject`. ## Message routing @@ -259,7 +263,7 @@ permission requests can be approved once with `once` or denied with `reject`. ## Firmware protocol reference -The BLE UART Bridge daemon wraps plugin messages into JSONL over BLE UART. For +The ESP-BLE-UART Daemon wraps plugin messages into JSONL over BLE UART. For request/response RPC, `POST /request` sends a non-empty bridge request ID: ```json @@ -410,4 +414,4 @@ and truncated before crossing BLE. ## Open items -- Add an integration test with a mocked BLE daemon. +- Add an integration test with a mocked ESP-BLE-UART Daemon. diff --git a/tools/ble/ble_uart_bridge/demos/opencode/src/ble-daemon-client.ts b/tools/ble/ble_uart_bridge/demos/opencode/src/ble-daemon-client.ts index 1a70326c2c6..be73b26e43a 100644 --- a/tools/ble/ble_uart_bridge/demos/opencode/src/ble-daemon-client.ts +++ b/tools/ble/ble_uart_bridge/demos/opencode/src/ble-daemon-client.ts @@ -7,7 +7,7 @@ import { isPermissionDecision } from "./opencode-permission-reply" import type { BridgeResponse, DaemonResponse, DaemonStatus } from "./types" /** - * Check whether the local BLE daemon is reachable. + * Check whether the local ESP-BLE-UART Daemon is reachable. * * This probe is intentionally silent: OpenCode loads plugins during startup, so * a missing optional daemon must not print fetch errors into the OpenCode UI. @@ -25,13 +25,13 @@ export async function isDaemonAvailable(): Promise { export async function getDaemonStatus(): Promise { const response = await fetch(`${BLE_DAEMON_URL}/status`) if (!response.ok) { - throw new Error(`BLE daemon status failed: HTTP ${response.status}`) + throw new Error(`ESP-BLE-UART Daemon status check failed: HTTP ${response.status}`) } return (await response.json()) as DaemonStatus } /** - * Normalize the BLE daemon's response envelope into a permission response. + * Normalize the ESP-BLE-UART Daemon's response envelope into a permission response. * * The daemon supports both nested `data`/`response` envelopes and a direct * top-level decision. Keeping that tolerance here prevents transport quirks @@ -61,11 +61,11 @@ function parseBridgeResponse(body: DaemonResponse): BridgeResponse { return body as BridgeResponse } - throw new Error(`BLE daemon returned an invalid response payload: ${JSON.stringify(body)}`) + throw new Error(`ESP-BLE-UART Daemon returned an invalid response payload: ${JSON.stringify(body)}`) } /** - * Send a one-way notification to the BLE daemon. + * Send a one-way notification to the ESP-BLE-UART Daemon. * * Use this for events such as session status updates or permission cancellation, * where the BLE device should update its UI but OpenCode is not waiting for a @@ -79,12 +79,12 @@ export async function notifyBLE(op: string, data: unknown): Promise { }) if (!response.ok) { - throw new Error(`BLE daemon notify failed: HTTP ${response.status}`) + throw new Error(`ESP-BLE-UART Daemon notify failed: HTTP ${response.status}`) } } /** - * Send a request to the BLE daemon and wait for a structured response. + * Send a request to the ESP-BLE-UART Daemon and wait for a structured response. * * Permission prompts use this path because OpenCode cannot continue until the * BLE device returns a decision or the request times out. @@ -101,7 +101,7 @@ export async function sendRequestToBLE(op: string, data: unknown, timeoutSeconds }) if (!response.ok) { - throw new Error(`BLE daemon request failed: HTTP ${response.status}`) + throw new Error(`ESP-BLE-UART Daemon request failed: HTTP ${response.status}`) } return parseBridgeResponse((await response.json()) as DaemonResponse) diff --git a/tools/ble/ble_uart_bridge/demos/opencode/src/config.ts b/tools/ble/ble_uart_bridge/demos/opencode/src/config.ts index 92b67734c12..3e60b0b5be7 100644 --- a/tools/ble/ble_uart_bridge/demos/opencode/src/config.ts +++ b/tools/ble/ble_uart_bridge/demos/opencode/src/config.ts @@ -31,7 +31,7 @@ export const METADATA_DISPLAY_KEYS = ["command", "path", "url"] as const /** Enables verbose local console logging when OPENCODE_BLE_DEBUG=1. */ export const DEBUG = process.env.OPENCODE_BLE_DEBUG === "1" -/** HTTP base URL of the local BLE daemon that bridges OpenCode to the BLE device. */ +/** HTTP base URL of the local ESP-BLE-UART Daemon that bridges OpenCode to the BLE device. */ export const BLE_DAEMON_URL = process.env.OPENCODE_BLE_DAEMON_URL ?? "http://127.0.0.1:8888" const DEFAULT_DECISION_TIMEOUT_SECONDS = 60 diff --git a/tools/ble/ble_uart_bridge/demos/opencode/src/opencode-ble-uart-bridge.ts b/tools/ble/ble_uart_bridge/demos/opencode/src/opencode-ble-uart-bridge.ts index 9c7e14694cd..980f405cf61 100644 --- a/tools/ble/ble_uart_bridge/demos/opencode/src/opencode-ble-uart-bridge.ts +++ b/tools/ble/ble_uart_bridge/demos/opencode/src/opencode-ble-uart-bridge.ts @@ -39,12 +39,12 @@ function stateMessage(state: BLEPluginState, status?: DaemonStatus): string { status?.reconnect_failures !== undefined && status.max_reconnect_failures !== undefined ? ` (${status.reconnect_failures}/${status.max_reconnect_failures} reconnect failures)` : "" - return `BLE UART daemon is reachable, but the device is disconnected${attempts}. The next BLE send will try to reconnect.` + return `ESP-BLE-UART Daemon is reachable, but the device is disconnected${attempts}. The next BLE send will try to reconnect.` } if (status?.daemon_state === "exiting") { - return "BLE UART daemon is exiting after repeated reconnect failures. BLE forwarding is disabled." + return "ESP-BLE-UART Daemon is exiting after repeated reconnect failures. BLE forwarding is disabled." } - return "BLE UART daemon is unreachable. BLE forwarding is disabled until the daemon is available." + return "ESP-BLE-UART Daemon is unreachable. BLE forwarding is disabled until the daemon is available." } async function notifyStateChange( @@ -54,7 +54,7 @@ async function notifyStateChange( ): Promise { const variant = state === "connected" ? "success" : state === "degraded" ? "warning" : "error" const message = stateMessage(state, status) - await showToastBestEffort(client, variant, "OpenCode BLE UART Bridge", message) + await showToastBestEffort(client, variant, "OpenCode ESP-BLE-UART Bridge", message) await appLogBestEffort(client, variant === "error" ? "error" : variant === "warning" ? "warn" : "info", message, { state, status, @@ -95,7 +95,7 @@ export const BLEDeviceBridgePlugin: Plugin = async ({ client, serverUrl, directo bleState = "disabled" if (shouldNotify) { await notifyStateChange(openCodeClient, "disabled") - await appLogBestEffort(openCodeClient, "warn", "BLE UART daemon status check failed", { error: String(error) }) + await appLogBestEffort(openCodeClient, "warn", "ESP-BLE-UART Daemon status check failed", { error: String(error) }) } } return bleState @@ -124,7 +124,7 @@ export const BLEDeviceBridgePlugin: Plugin = async ({ client, serverUrl, directo // Forwarding session status is best-effort background work. Do not // await this async IIFE from the OpenCode event callback; otherwise a - // slow or unavailable BLE daemon could block OpenCode's own event loop. + // slow or unavailable ESP-BLE-UART Daemon could block OpenCode's own event loop. void (async () => { try { const previousState = bleState @@ -139,7 +139,7 @@ export const BLEDeviceBridgePlugin: Plugin = async ({ client, serverUrl, directo await showToastBestEffort( openCodeClient, "success", - "OpenCode BLE UART Bridge", + "OpenCode ESP-BLE-UART Bridge", "BLE UART device is connected for this OpenCode session.", ) } @@ -149,8 +149,8 @@ export const BLEDeviceBridgePlugin: Plugin = async ({ client, serverUrl, directo if ( // If the session became idle while a BLE permission prompt is - // active, mark that prompt as externally resolved and ask the BLE - // daemon to dismiss it. This prevents an old prompt from being + // active, mark that prompt as externally resolved and ask the + // ESP-BLE-UART Daemon to dismiss it. This prevents an old prompt from being // answered after OpenCode no longer needs the decision. Only idle // triggers this cancellation: busy/retry are normal activity // transitions and should not dismiss an actively displayed prompt. diff --git a/tools/ble/ble_uart_bridge/demos/opencode/src/opencode-permission-reply.ts b/tools/ble/ble_uart_bridge/demos/opencode/src/opencode-permission-reply.ts index 8d4fe00c37c..b966c4bcdd7 100644 --- a/tools/ble/ble_uart_bridge/demos/opencode/src/opencode-permission-reply.ts +++ b/tools/ble/ble_uart_bridge/demos/opencode/src/opencode-permission-reply.ts @@ -174,7 +174,7 @@ export async function replyToOpenCodePermission( throw new Error("OpenCode client does not expose a permission reply API") } -/** Runtime guard for permission decisions parsed from BLE daemon JSON. */ +/** Runtime guard for permission decisions parsed from ESP-BLE-UART Daemon JSON. */ export function isPermissionDecision(value: unknown): value is PermissionDecision { return value === "once" || value === "reject" } diff --git a/tools/ble/ble_uart_bridge/demos/opencode/src/permission-payload.ts b/tools/ble/ble_uart_bridge/demos/opencode/src/permission-payload.ts index 9507de4cc22..a5903a8fea0 100644 --- a/tools/ble/ble_uart_bridge/demos/opencode/src/permission-payload.ts +++ b/tools/ble/ble_uart_bridge/demos/opencode/src/permission-payload.ts @@ -9,7 +9,7 @@ import { } from "./config" import type { PermissionEventProperties } from "./types" -/** Create a unique event ID for messages sent to the BLE daemon. */ +/** Create a unique event ID for messages sent to the ESP-BLE-UART Daemon. */ function eventID() { return crypto.randomUUID() } @@ -116,7 +116,7 @@ export function permissionRequestID(permission: PermissionEventProperties): stri } /** - * Build the protocol message sent to the BLE daemon whenever OpenCode's session + * Build the protocol message sent to the ESP-BLE-UART Daemon whenever OpenCode's session * state changes. This is a one-way notification, so the BLE device can update * its UI but is not expected to send a reply. */ @@ -135,7 +135,7 @@ export function buildSessionStatusPayload( } /** - * Tell the BLE daemon to dismiss any permission prompt for this session. + * Tell the ESP-BLE-UART Daemon to dismiss any permission prompt for this session. * * This is used when OpenCode has already moved on, for example after the * session becomes idle before the BLE device returns a decision. @@ -156,7 +156,7 @@ export function buildPermissionCancelPayload(sessionID: string) { /** * Build the BLE permission prompt payload from an OpenCode permission event. * - * This is the main protocol boundary between OpenCode and the BLE daemon. The + * This is the main protocol boundary between OpenCode and the ESP-BLE-UART Daemon. The * outer fields describe routing and reply behavior; the nested `payload` fields * are intentionally small and display-oriented for the device UI. */ diff --git a/tools/ble/ble_uart_bridge/demos/opencode/src/permission-queue.ts b/tools/ble/ble_uart_bridge/demos/opencode/src/permission-queue.ts index e3ef49b254a..e1e6f66c7b7 100644 --- a/tools/ble/ble_uart_bridge/demos/opencode/src/permission-queue.ts +++ b/tools/ble/ble_uart_bridge/demos/opencode/src/permission-queue.ts @@ -174,7 +174,7 @@ async function handlePermissionQueueItem(item: PermissionQueueItem): Promise -# Porting BLE UART Bridge to Custom Scripts +# Porting ESP-BLE-UART Bridge to Custom Scripts -This guide explains how to reuse BLE UART Bridge in your own Python scripts. +This guide explains how to reuse ESP-BLE-UART Bridge in your own Python scripts. Use the Core API when the Console and Daemon are not the right abstraction for your application. For example, use Core directly when you want to implement custom framing, a test harness, a device provisioning flow, or a domain-specific automation script. @@ -18,7 +18,7 @@ Use the Core API when the Console and Daemon are not the right abstraction for y ## Install dependencies -You can reuse the ESP-IDF Python environment, or use your own Python virtual environment. If you reuse the ESP-IDF environment, export it first and then install the extra dependencies required by BLE UART Bridge: +You can reuse the ESP-IDF Python environment, or use your own Python virtual environment. If you reuse the ESP-IDF environment, export it first and then install the extra dependencies required by ESP-BLE-UART Bridge: ```bash cd $IDF_PATH diff --git a/tools/ble/ble_uart_bridge/docs/Profile-Compatibility.md b/tools/ble/ble_uart_bridge/docs/Profile-Compatibility.md index fc88264786b..ca2203849a3 100644 --- a/tools/ble/ble_uart_bridge/docs/Profile-Compatibility.md +++ b/tools/ble/ble_uart_bridge/docs/Profile-Compatibility.md @@ -1,16 +1,16 @@ -# BLE UART Profile Compatibility +# ESP-BLE-UART Profile Compatibility -BLE UART Bridge works with BLE GATT profiles that provide a UART-like data path: +ESP-BLE-UART Bridge works with BLE GATT profiles that provide a UART-like data path: - one characteristic that the host writes to - one characteristic that the device uses to notify data back to the host The default profile matches the widely used BLE UART-over-GATT UUID set (service `6E400001-…`, RX/TX characteristics), but that layout is not the only possible BLE UART-style profile. -## Default BLE-UART-compatible profile +## Default BLE UART-compatible profile The built-in default profile uses these UUIDs: @@ -33,7 +33,7 @@ ESP-IDF includes BLE SPP examples that implement Espressif BLE UART-like vendor- BLE SPP over BLE is not a Bluetooth SIG standard profile. It is a vendor-specific GATT design that emulates a serial link, similar in purpose to the default BLE UART layout above. -ESP-IDF BLE SPP examples may define more characteristics than BLE UART Bridge needs, such as data, command, and status characteristics. To use BLE UART Bridge with such a profile, map only the UART-like data path into `BLEUARTProfile`. +ESP-IDF BLE SPP examples may define more characteristics than ESP-BLE-UART Bridge needs, such as data, command, and status characteristics. To use ESP-BLE-UART Bridge with such a profile, map only the UART-like data path into `BLEUARTProfile`. ## Mapping an ESP-IDF BLE SPP profile @@ -63,22 +63,22 @@ bridge = BLEUARTBridge("AA:BB:CC:DD:EE:FF", profile=profile) Replace the UUIDs with the actual UUIDs used by the device firmware. -## What BLE UART Bridge does not map +## What ESP-BLE-UART Bridge does not map -BLE UART Bridge is intentionally focused on the data path. It does not automatically map extra control-plane characteristics that a profile may expose, such as: +ESP-BLE-UART Bridge is intentionally focused on the data path. It does not automatically map extra control-plane characteristics that a profile may expose, such as: - command characteristics - status characteristics - custom configuration characteristics - profile-specific flow-control semantics -If an application needs those characteristics, implement that logic in a custom script on top of `bleak`, or extend BLE UART Bridge for that specific profile. +If an application needs those characteristics, implement that logic in a custom script on top of `bleak`, or extend ESP-BLE-UART Bridge for that specific profile. ## Classic Bluetooth SPP is different Classic Bluetooth SPP examples, such as `examples/bluetooth/bluedroid/classic_bt/bt_spp_*`, are not BLE GATT profiles. -They use Classic Bluetooth SPP rather than BLE GATT characteristics, so they are not compatible with BLE UART Bridge. +They use Classic Bluetooth SPP rather than BLE GATT characteristics, so they are not compatible with ESP-BLE-UART Bridge. ## Related docs diff --git a/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md b/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md index 5570ff2195d..7d435a7d464 100644 --- a/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md +++ b/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Console.md @@ -1,16 +1,16 @@ -# Quick Start: BLE UART Console +# Quick Start: ESP-BLE-UART Console -This guide shows how to use the BLE UART Console for quick manual testing. +This guide shows how to use the ESP-BLE-UART Console for quick manual testing. The Console is useful when you want to type data into a BLE UART device and inspect the bytes or text sent back by the device. ## Prerequisites 1. A host machine with Bluetooth access. -2. Python environment prepared. You can reuse the ESP-IDF Python environment, or use your own Python virtual environment. If you reuse the ESP-IDF environment, export it first and then install the BLE UART Bridge dependencies: +2. Python environment prepared. You can reuse the ESP-IDF Python environment, or use your own Python virtual environment. If you reuse the ESP-IDF environment, export it first and then install the ESP-BLE-UART Bridge dependencies: ```bash cd $IDF_PATH @@ -21,7 +21,7 @@ The Console is useful when you want to type data into a BLE UART device and insp On Windows, run `export.bat` or `export.ps1` from the ESP-IDF root directory before installing `requirements.txt`. If you use your own Python virtual environment instead, activate it before installing `requirements.txt`. -3. A BLE device advertising the BLE UART service. By default the tool scans for the de-facto BLE UART-over-GATT UUIDs (`6E400001-…` / `…02` / `…03`). For a known-compatible test target, build and flash the [BLE UART Service example](../../../../examples/bluetooth/ble_uart_service), which acts as an Echo Server by echoing RX writes back through TX notifications. +3. A BLE device advertising the BLE UART service. By default the tool scans for the de-facto BLE UART-over-GATT UUIDs (`6E400001-…` / `…02` / `…03`). For a known-compatible test target, build and flash the [ESP-BLE-UART example](../../../../examples/bluetooth/ble_uart_service), which acts as an Echo Server by echoing RX writes back through TX notifications. ## Find a device @@ -33,7 +33,7 @@ python main.py list-devices Example output may include a device address and name: ```text -Found: AA:BB:CC:DD:EE:FF, with name esp-ble-uart, rssi=-42 +Found: AA:BB:CC:DD:EE:FF, with name BleUart-XXXX, rssi=-42 ``` Use the printed device identifier as `DEVICE_ID`. On macOS, this identifier is a CoreBluetooth UUID and is different from the device MAC address. @@ -131,9 +131,9 @@ This affects BLE GATT write behavior only. It does not create an application-lev ## Common examples -### ESP-IDF BLE UART Echo Server +### ESP-BLE-UART Echo Server -Use the [BLE UART Service example](../../../../examples/bluetooth/ble_uart_service) when you want a ready-made ESP-IDF Echo Server for testing BLE UART Bridge Console. After building, flashing, and pairing with the example, open Console and type any text; the example should echo the same data back as `[RX]` output. +Use the [ESP-BLE-UART example](../../../../examples/bluetooth/ble_uart_service) when you want a ready-made ESP-IDF Echo Server for testing ESP-BLE-UART Bridge Console. After building, flashing, and pairing with the example, open Console and type any text; the example should echo the same data back as `[RX]` output. ```bash # List nearby BLE devices and use the printed device ID as DEVICE_ID diff --git a/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Daemon.md b/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Daemon.md index 32f67f7c6f9..bf130feef71 100644 --- a/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Daemon.md +++ b/tools/ble/ble_uart_bridge/docs/Quick-Start-BLE-UART-Daemon.md @@ -1,16 +1,16 @@ -# Quick Start: BLE UART Daemon +# Quick Start: ESP-BLE-UART Daemon -This guide shows how to use BLE UART Daemon mode and the lightweight JSONL RPC protocol used between the host and the BLE device. +This guide shows how to use ESP-BLE-UART Daemon mode and the lightweight JSONL RPC protocol used between the host and the BLE device. Daemon mode is useful when another local process needs to communicate with a BLE UART device without owning the BLE connection itself. ## Prerequisites 1. A host machine with Bluetooth access. -2. Python environment prepared. You can reuse the ESP-IDF Python environment, or use your own Python virtual environment. If you reuse the ESP-IDF environment, export it first and then install the BLE UART Bridge dependencies: +2. Python environment prepared. You can reuse the ESP-IDF Python environment, or use your own Python virtual environment. If you reuse the ESP-IDF environment, export it first and then install the ESP-BLE-UART Bridge dependencies: ```bash cd $IDF_PATH diff --git a/tools/ble/ble_uart_bridge/src/console/api.py b/tools/ble/ble_uart_bridge/src/console/api.py index e8e01ebb058..3e193472ae7 100644 --- a/tools/ble/ble_uart_bridge/src/console/api.py +++ b/tools/ble/ble_uart_bridge/src/console/api.py @@ -16,7 +16,7 @@ def run_console( encoding: ConsoleEncoding | str = ConsoleEncoding.text, with_response: bool = False, ) -> None: - # Initialize BLE UART Console + # Initialize ESP-BLE-UART Console console = BLEUARTConsole( device_id, terminator=terminator, diff --git a/tools/ble/ble_uart_bridge/src/console/console.py b/tools/ble/ble_uart_bridge/src/console/console.py index ffa8079689c..23d563e38c9 100644 --- a/tools/ble/ble_uart_bridge/src/console/console.py +++ b/tools/ble/ble_uart_bridge/src/console/console.py @@ -130,14 +130,14 @@ class BLEUARTConsole(App): try: # Should try connection to catch KeyInterrupt during connection establishment if not await self._bridge.connect(): - logger.error(f'Failed to open BLE UART Console for {self._device_id}') + logger.error(f'Failed to open ESP-BLE-UART Console for {self._device_id}') return # Run UI event loop await self.run_async() finally: # Disconnect from device - logger.info(f'Closing BLE UART Console for {self._device_id}...') + logger.info(f'Closing ESP-BLE-UART Console for {self._device_id}...') await self._bridge.disconnect() # Textual lifecycle hook: build the widget tree before the app is mounted. @@ -166,7 +166,7 @@ class BLEUARTConsole(App): # Textual lifecycle hook: widgets are ready, so BLE can be connected and UI updated. async def on_mount(self) -> None: self._ui_ready = True - self.title = f'BLE UART — {self._device_id}' + self.title = f'ESP-BLE-UART — {self._device_id}' self.query_one('#input', Input).focus() self._write_info(f'Connected to {self._device_id}') self._drain_rx_pending() diff --git a/tools/ble/ble_uart_bridge/src/core/api.py b/tools/ble/ble_uart_bridge/src/core/api.py index c0b174bface..5966606ca98 100644 --- a/tools/ble/ble_uart_bridge/src/core/api.py +++ b/tools/ble/ble_uart_bridge/src/core/api.py @@ -11,7 +11,7 @@ def run_list_devices() -> None: def run_connection_check(device_id: str) -> None: - # Initialize BLE UART Bridge + # Initialize ESP-BLE-UART Bridge bridge = BLEUARTBridge(device_id) # Connection check diff --git a/tools/ble/ble_uart_bridge/src/core/errors.py b/tools/ble/ble_uart_bridge/src/core/errors.py index 936be35af42..6c8dca31a87 100644 --- a/tools/ble/ble_uart_bridge/src/core/errors.py +++ b/tools/ble/ble_uart_bridge/src/core/errors.py @@ -5,15 +5,15 @@ from __future__ import annotations class BUBError(Exception): - """Base exception for the BLE UART Bridge.""" + """Base exception for the ESP-BLE-UART Bridge.""" class DeviceNotFoundError(BUBError): - """Raised when the requested BLE UART device cannot be found.""" + """Raised when the requested device cannot be found.""" class ConnectionTimeout(BUBError): - """Raised when the client cannot connect to a BLE UART device.""" + """Raised when the client cannot connect to the device.""" class NotConnectedError(BUBError): diff --git a/tools/ble/ble_uart_bridge/src/daemon/api.py b/tools/ble/ble_uart_bridge/src/daemon/api.py index 54af7d882da..44eebc8f0ff 100644 --- a/tools/ble/ble_uart_bridge/src/daemon/api.py +++ b/tools/ble/ble_uart_bridge/src/daemon/api.py @@ -34,9 +34,9 @@ def _request_json( detail = e.read().decode(errors='replace') raise RuntimeError(f'Daemon request failed with HTTP {e.code}: {detail}') from e except TimeoutError as e: - raise RuntimeError(f'Timed out waiting for BLE UART Daemon: {url}') from e + raise RuntimeError(f'Timed out waiting for ESP-BLE-UART Daemon: {url}') from e except URLError as e: - raise RuntimeError(f'Failed to connect to BLE UART Daemon: {e.reason}') from e + raise RuntimeError(f'Failed to connect to ESP-BLE-UART Daemon: {e.reason}') from e if not body: return {} diff --git a/tools/ble/ble_uart_bridge/src/daemon/server.py b/tools/ble/ble_uart_bridge/src/daemon/server.py index 3f4235ead86..33510956537 100644 --- a/tools/ble/ble_uart_bridge/src/daemon/server.py +++ b/tools/ble/ble_uart_bridge/src/daemon/server.py @@ -29,7 +29,7 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: app.state.bridge = BLEUARTBridge(app.state.device_id) app.state.request_lock = asyncio.Lock() - # Set BLE UART Bridge RX callback + # Set ESP-BLE-UART Bridge RX callback loop = asyncio.get_running_loop() app.state.rx_buffer = bytearray() app.state.pending_requests = {} @@ -53,8 +53,8 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: # Try to connect to the device if not await app.state.bridge.connect(): - logger.error('Failed to start BLE UART Daemon!') - raise RuntimeError('Failed to start BLE UART Daemon!') + logger.error('Failed to start ESP-BLE-UART Daemon!') + raise RuntimeError('Failed to start ESP-BLE-UART Daemon!') yield @@ -62,7 +62,7 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]: await app.state.bridge.disconnect() -app = FastAPI(title='BLE UART Daemon', lifespan=lifespan) +app = FastAPI(title='ESP-BLE-UART Daemon', lifespan=lifespan) def _request_data_size(data: object) -> int: From e60bf4d43f742f8e8d8cfd4d8e1f6d6878bbc692 Mon Sep 17 00:00:00 2001 From: Zhi Wei Jian Date: Fri, 26 Jun 2026 09:07:54 +0800 Subject: [PATCH 3/3] feat(bt/ble_uart): Support ble uart more interfaces - Added tagged event API (ble_uart_evt_t / on_event) - Added bond management APIs - Supported custom adv_data / scan_rsp_data - Validate device_name length synchronously - Added ble_uart_close_async() and EVT_CLOSED - Added granular security config (security struct) - Supported Passkey Entry and Numeric Comparison (cherry picked from commit f1d9c994d29c2ba3995301f771474872bc493471) Co-authored-by: zhiweijian --- examples/bluetooth/.build-test-rules.yml | 8 + examples/bluetooth/ble_uart_service/README.md | 180 +++- .../ble_uart_service/main/Kconfig.projbuild | 47 + .../bluetooth/ble_uart_service/main/main.c | 151 ++- .../ble_uart_service/sdkconfig.ci.bluedroid | 24 + .../ble_uart_service/sdkconfig.ci.nimble | 7 + examples/bluetooth/common/ble_uart/PORTING.md | 858 +++++++++++++++- examples/bluetooth/common/ble_uart/ble_uart.h | 585 ++++++++++- .../common/ble_uart/ble_uart_bluedroid.c | 792 +++++++++++++- .../common/ble_uart/ble_uart_nimble.c | 963 ++++++++++++++++-- 10 files changed, 3381 insertions(+), 234 deletions(-) create mode 100644 examples/bluetooth/ble_uart_service/main/Kconfig.projbuild create mode 100644 examples/bluetooth/ble_uart_service/sdkconfig.ci.bluedroid create mode 100644 examples/bluetooth/ble_uart_service/sdkconfig.ci.nimble diff --git a/examples/bluetooth/.build-test-rules.yml b/examples/bluetooth/.build-test-rules.yml index fc244d5340b..ac1f96d0458 100644 --- a/examples/bluetooth/.build-test-rules.yml +++ b/examples/bluetooth/.build-test-rules.yml @@ -15,6 +15,14 @@ examples/bluetooth: disable: - if: SOC_BT_SUPPORTED != 1 +examples/bluetooth/ble_uart_service: + <<: *bt_default_depends + disable: + - if: SOC_BLE_SUPPORTED != 1 + depends_filepatterns: + - examples/bluetooth/common/ble_uart/**/* + - examples/bluetooth/ble_uart_service/**/* + examples/bluetooth/bluedroid/ble: <<: *bt_default_depends disable: diff --git a/examples/bluetooth/ble_uart_service/README.md b/examples/bluetooth/ble_uart_service/README.md index 7ac05d24644..3e16e5b5e84 100644 --- a/examples/bluetooth/ble_uart_service/README.md +++ b/examples/bluetooth/ble_uart_service/README.md @@ -24,12 +24,19 @@ ble_uart_install(&cfg); // NimBLE host + BLE UART GATT service ble_uart_open(); // start advertising + auto-encrypt ``` -…and two matching tear-down calls if your app ever needs to power -BLE off at runtime: +If your app powers BLE off at runtime, use **one** of the release paths +in [PORTING.md §5.3](../common/ble_uart/PORTING.md#53-lifecycle--bring-up-and-release) +(this example uses Path A from `app_main`): + +| Path | When | Calls | +| --- | --- | --- | +| **A — sync** (default) | Shutdown from a normal task (button, Wi-Fi, `app_main`) | `ble_uart_close()` → `ble_uart_uninstall()` | +| **B — async** | Shutdown triggered inside `on_event` / `on_rx` | `close_async()` in callback → `CLOSED` sets flag → **`uninstall()` on a separate app task** (not inside `CLOSED`) | ```c -ble_uart_close(); // stop advertising / disconnect / halt host -ble_uart_uninstall(); // free the NimBLE port + reset state +/* Path A — this example style */ +ble_uart_close(); +ble_uart_uninstall(); ``` When a central connects, the firmware automatically initiates LE Secure @@ -47,49 +54,135 @@ back with `ble_uart_tx()`. | TX (out) | `6e400003-b5a3-f393-e0a9-e50e24dcca9e` | Notify (auto-CCCD) | encrypted, authenticated | The `_ENC | _AUTHEN` flags are turned on only when `cfg.encrypted = true` -(the default in this example). +(the default in this example). The two flags can be controlled +independently via `cfg.security.mitm` (drops `_AUTHEN`) and the +combined `cfg.security.{sc,bonding,mitm}` set (all OFF drops `_ENC` +too) — see PORTING.md §5.6. ## Files | File | Lines | Role | | --- | ---: | --- | -| `main/main.c` | ~70 | NVS init, MAC-derived device name, install + open, RX echo handler. Identical for both backends. | +| `main/main.c` | ~200 | NVS init, install + open with `-XXXX` device name (Kconfig prefix + BT MAC suffix), RX echo handler, lifecycle/link-state event sink, bonded-peer dump on boot. Identical for both backends. | +| `main/Kconfig.projbuild` | ~50 | Example-local `EXAMPLE_CUSTOM_ADV_DATA` switch — toggles the `ble_uart_config_t::adv_data` demo path in `main.c`. | | `CMakeLists.txt` (root) | ~15 | `list(APPEND EXTRA_COMPONENT_DIRS .../common/ble_uart)` before `project()` so `main` can `REQUIRES ble_uart`. | -| `../common/ble_uart/ble_uart.h` | ~155 | Stack-agnostic public API: 3-field config + 4 lifecycle functions + TX/status + UUID + `BLE_UART_E*` return codes. No NimBLE / Bluedroid types leak through. | -| `../common/ble_uart/ble_uart_nimble.c` | ~650 | NimBLE backend: host bring-up, BLE UART GATT service via `ble_gatts_add_svcs`, advertising, pairing, install/open/close/uninstall. Active when `CONFIG_BT_NIMBLE_ENABLED=y`. | -| `../common/ble_uart/ble_uart_bluedroid.c` | ~1020 | Bluedroid backend: controller + host enable, BLE UART GATT service via `esp_ble_gatts_create_attr_tab` (service-table API), advertising, pairing, full PREP/EXEC long-write reassembly, install/open/close/uninstall. Active when `CONFIG_BT_BLUEDROID_ENABLED=y`. | -| `../common/ble_uart/Kconfig` | ~30 | Device-name prefix + RX scratch size (`menuconfig → Component configuration → ESP-BLE-UART library`). | -| `../common/ble_uart/PORTING.md` | ~724 | Porting and API guide (integration, CMake, sdkconfig, thread safety). | +| `../common/ble_uart/ble_uart.h` | ~640 | Stack-agnostic public API: configuration struct (preset + per-feature security overrides + custom adv payload + RX/event callbacks) + lifecycle (install/open/close/close_async/uninstall) + TX + pairing replies + bond-management + status + UUID + `BLE_UART_E*` return codes. No NimBLE / Bluedroid types leak through. | +| `../common/ble_uart/ble_uart_nimble.c` | ~1290 | NimBLE backend: host bring-up, BLE UART GATT service via `ble_gatts_add_svcs`, advertising (default + raw), pairing (incl. Passkey Entry / Numeric Comparison), bond store, async close, install/open/close/uninstall. Active when `CONFIG_BT_NIMBLE_ENABLED=y`. | +| `../common/ble_uart/ble_uart_bluedroid.c` | ~1660 | Bluedroid backend: controller + host enable, BLE UART GATT service via `esp_ble_gatts_create_attr_tab` (service-table API), advertising (default + raw), pairing (incl. Passkey Entry / Numeric Comparison), bond store, async close, full PREP/EXEC long-write reassembly, install/open/close/uninstall. Active when `CONFIG_BT_BLUEDROID_ENABLED=y`. | +| `../common/ble_uart/Kconfig` | ~30 | Device name prefix + RX scratch size (`menuconfig → Component configuration → ESP-BLE-UART library`). | +| `../common/ble_uart/PORTING.md` | ~1300 | Porting and API guide (integration, CMake, sdkconfig, security model, custom advertising, bond management, thread safety). | | `sdkconfig.defaults` | — | Default: NimBLE backend, MTU 512, SC + bonding + persistent NVS. | | `sdkconfig.bluedroid` | — | Overlay: switch to Bluedroid backend (used via `-D SDKCONFIG_DEFAULTS=...`, see "Choosing the host stack" below). | ## Public API ```c -typedef void (*ble_uart_rx_cb_t)(const uint8_t *data, size_t len); +typedef void (*ble_uart_rx_cb_t) (const uint8_t *data, size_t len); +typedef void (*ble_uart_evt_cb_t)(const ble_uart_evt_t *evt); typedef struct { - bool encrypted; /* SC + Bonding + MITM in one knob */ - const char *device_name; - ble_uart_rx_cb_t ble_uart_on_rx; + ble_uart_sec_t sc; /* AUTO / OFF / ON */ + ble_uart_sec_t bonding; + ble_uart_sec_t mitm; + ble_uart_io_cap_t io_cap; /* AUTO / NO_INPUT_OUTPUT / DISPLAY_ONLY / + KEYBOARD_ONLY / DISPLAY_YES_NO / + KEYBOARD_DISPLAY */ +} ble_uart_security_t; + +typedef struct { + bool encrypted; /* preset: SC + Bonding + MITM + DisplayOnly */ + ble_uart_security_t security; /* per-feature overrides; see PORTING.md §5.6 */ + + const char *device_name; /* ≤ BLE_UART_DEVICE_NAME_MAX (26) */ + /* Optional: raw advertising / scan-response bytes (NULL → defaults). + * Limits: adv_data_len ≤ BLE_UART_ADV_DATA_MAX (28), + * scan_rsp_data_len ≤ BLE_UART_SCAN_RSP_DATA_MAX (31). + * The 3-byte Flags AD element is prepended automatically — don't + * include it in adv_data. See PORTING.md §5.9 for examples. */ + const uint8_t *adv_data; + size_t adv_data_len; + const uint8_t *scan_rsp_data; + size_t scan_rsp_data_len; + ble_uart_rx_cb_t ble_uart_on_rx; + ble_uart_evt_cb_t on_event; /* lifecycle / link-state events; NULL drops */ } ble_uart_config_t; +typedef struct { + uint8_t bytes[6]; /* big-endian: bytes[0] is the MSB (AA:BB:CC:DD:EE:FF) */ + uint8_t type; /* BLE_UART_ADDR_TYPE_PUBLIC | _RANDOM */ +} ble_uart_addr_t; + /* Lifecycle */ -int ble_uart_install(const ble_uart_config_t *cfg); /* NimBLE host + GATT */ +int ble_uart_install(const ble_uart_config_t *cfg); /* host + GATT */ int ble_uart_open(void); /* host task + advertising */ int ble_uart_close(void); /* stop adv / disconnect / halt host */ -int ble_uart_uninstall(void); /* free NimBLE port + reset state */ +int ble_uart_close_async(void); /* same, fire-and-forget; safe from inside on_event/on_rx */ +int ble_uart_uninstall(void); /* free port + reset state */ /* Data path */ int ble_uart_tx(const uint8_t *data, size_t len); +/* Pairing replies (call from on_event for input-capable IO caps) */ +int ble_uart_passkey_reply(uint32_t passkey); /* answer PASSKEY_REQUEST */ +int ble_uart_compare_reply(bool match); /* answer NUMERIC_COMPARE */ + /* Status (best-effort snapshot) */ bool ble_uart_is_connected(void); bool ble_uart_is_subscribed(void); +/* Bond management (works after install()) */ +int ble_uart_get_bond_count(size_t *out_count); +int ble_uart_get_bonded_peers(ble_uart_addr_t *out, size_t cap, size_t *out_count); +int ble_uart_remove_peer(const ble_uart_addr_t *peer); +int ble_uart_clear_bonds(void); + extern const ble_uart_uuid128_t ble_uart_service_uuid; ``` +### Event callback + +`on_event` is invoked on the BLE host task (same context as `ble_uart_on_rx`) +with a tagged `ble_uart_evt_t`. Use `LINK_SECURE` — not `is_connected()` — +to gate any application logic that requires the channel to be encrypted / +authenticated: + +| `evt->id` | Payload | Fires when | +| ------------------------------- | ------------------------------------------------------- | ---------- | +| `BLE_UART_EVT_CONNECTED` | `connected.peer` | Physical link up | +| `BLE_UART_EVT_DISCONNECTED` | `disconnected.reason` (int, stack-specific) | Physical link down — Bluedroid: `esp_gatt_conn_reason_t`; NimBLE: BLE host return code (`BLE_HS_HCI_ERR()` for HCI) | +| `BLE_UART_EVT_SUBSCRIBED` | `subscribed.subscribed` | Central writes CCCD on TX (edge-triggered) | +| `BLE_UART_EVT_LINK_SECURE` | `link_secure.{encrypted,authenticated,bonded,key_size}` | Pairing or bonded reconnect succeeds | +| `BLE_UART_EVT_PASSKEY_DISPLAY` | `passkey.passkey` (0..999999) | SM asks the device to show a passkey | +| `BLE_UART_EVT_PASSKEY_REQUEST` | — | SM asks the user to enter a passkey shown by the central — answer with `ble_uart_passkey_reply()` | +| `BLE_UART_EVT_NUMERIC_COMPARE` | `numeric_compare.passkey` (0..999999) | SM asks the user to confirm both sides display the same value — answer with `ble_uart_compare_reply()` | +| `BLE_UART_EVT_PAIRING_FAILED` | `pairing_failed.reason` (stack-specific) | Pairing rejected or timed out | +| `BLE_UART_EVT_CLOSED` | `closed.status` (`BLE_UART_*`) | `ble_uart_close_async()` worker has finished; `BLE_UART_OK` means tear-down succeeded | + +The default passkey UART banner still prints; the callback is additive so +log-scraping tests stay compatible. Don't block in the callback. + +**Callback rules:** + +- Do **not** call `ble_uart_close()` or `ble_uart_uninstall()` from + `on_event` / `on_rx` (host task — deadlocks). +- To start teardown from a callback, call `ble_uart_close_async()` only. +- Call `ble_uart_uninstall()` from a **normal app task** after + `BLE_UART_EVT_CLOSED` with `closed.status == BLE_UART_OK` (see + [PORTING.md §5.3.2](../common/ble_uart/PORTING.md#532-path-b--release-after-a-ble-event-close_async)). + +Path B sketch (full code in PORTING.md): + +```c +case BLE_UART_EVT_PAIRING_FAILED: + ble_uart_close_async(); + break; +case BLE_UART_EVT_CLOSED: + if (e->closed.status == BLE_UART_OK) { + s_ble_closed_ok = true; /* app task calls uninstall */ + } + break; +``` + ## Choosing the host stack The same `ble_uart.h` API is implemented twice — once on top of NimBLE @@ -134,8 +227,10 @@ When neither is enabled the build fails up-front with a clear error. idf.py set-target esp32c3 # or esp32, esp32s3, esp32c6, esp32h2 ... idf.py menuconfig # optional # Component configuration -> ESP-BLE-UART library -# - BLE device name prefix (default: BleUart) +# - BLE device name prefix (default: BleUart; example appends -XXXX from BT MAC) # - RX scratch buffer size (default: 1024 bytes) +# BLE UART service example +# - Use custom advertising data (default: off) ``` Those `BLE_UART_*` options are defined in **`../common/ble_uart/Kconfig`** @@ -143,6 +238,27 @@ Those `BLE_UART_*` options are defined in **`../common/ble_uart/Kconfig`** build (this example pulls it in via `EXTRA_COMPONENT_DIRS` in the root `CMakeLists.txt`). +`EXAMPLE_CUSTOM_ADV_DATA` is example-local (`main/Kconfig.projbuild`) +and demonstrates `ble_uart_config_t::adv_data` — the field that lets +the application fully control the over-the-air advertising payload +instead of using the library default. + +When the option is on, `app_main` hands a static byte array +(`example_adv_payload[]`, top of `main.c`) to `ble_uart_install()`. +The array is just a sequence of `[length][AD type][value]` triplets; +edit it directly to advertise whatever you want — a different Local +Name, Manufacturer Specific Data, custom Service Data, additional +Service UUIDs, etc. The only hard rule is total length ≤ +`BLE_UART_ADV_DATA_MAX` (28); the 3-byte Flags AD is added by the +library and does not count against that budget. + +The GAP-service Device Name (set via `device_name` in the same +config struct) is independent and is what connected centrals read +post-pair, regardless of `adv_data`. + +With the option off the library default is used (Complete Local Name +in the primary packet, 128-bit Service UUID in the scan response). + The two security knobs are set in `sdkconfig.defaults`: ```ini @@ -154,6 +270,17 @@ Disable `cfg.encrypted` in `main.c` (set it to `false`) for plaintext operation in the lab — the GATT characteristics drop their `_ENC` flags accordingly. Production firmware should keep encryption on. +For finer control without going all-or-nothing — e.g. a displayless +gateway that wants encryption + bonding but no passkey UI, or a +device with a keypad that wants Passkey Entry / Numeric Comparison — +keep `cfg.encrypted = true` and override individual bits via +`cfg.security.{sc,bonding,mitm,io_cap}`. The input-capable IO caps +(`KEYBOARD_ONLY`, `DISPLAY_YES_NO`, `KEYBOARD_DISPLAY`) require an +`on_event` handler that wires `BLE_UART_EVT_PASSKEY_REQUEST` / +`NUMERIC_COMPARE` to `ble_uart_passkey_reply()` / +`ble_uart_compare_reply()`. See PORTING.md §5.6 for the full matrix +and worked examples. + ### Build & flash ```bash @@ -170,7 +297,7 @@ I (xxx) ble_uart: registered chr 6e400002-... def=15 val=16 I (xxx) ble_uart: registered chr 6e400003-... def=17 val=18 I (xxx) ble_uart: addr=80:7d:3a:11:22:33 I (xxx) ble_uart: BLE host task started -I (xxx) ble_uart: advertising as 'BleUart-XXXX' +I (xxx) ble_uart: advertising as 'BleUart-2233' ``` Expected boot log (Bluedroid backend): @@ -186,8 +313,10 @@ I (xxx) ble_uart: advertising started 1. On a phone, install **a BLE GATT client app** that supports scanning, pairing, characteristic write, and notify/CCCD (many mobile “BLE tools” or serial-over-BLE utilities qualify). -2. Scan, tap **Connect** on `BleUart-XXXX`. The phone prompts for a - 6-digit code. +2. Scan, tap **Connect** on `BleUart-XXXX` (prefix from + `CONFIG_BLE_UART_DEVICE_NAME_PREFIX`, `XXXX` = last two BT MAC + bytes). The phone prompts for a 6-digit + code. 3. The device prints a fresh code in a banner on UART: ``` @@ -204,8 +333,13 @@ I (xxx) ble_uart: advertising started 6. Disconnect and reconnect: no passkey prompt — the bond resumes automatically. -To wipe the bond and force a fresh passkey, run `idf.py erase-flash` -and re-flash. +To wipe the bond and force a fresh passkey there are three options: + +- Call `ble_uart_clear_bonds()` from your app (preserves the rest of NVS) +- Call `ble_uart_remove_peer(&addr)` to drop one peer (use the address + reported in `BLE_UART_EVT_CONNECTED`, or any address you happen to + have stored — Bluedroid matches by address only, NimBLE by identity) +- Run `idf.py erase-flash` and re-flash (also wipes WiFi creds, NVS, etc.) ## Adapting to your application diff --git a/examples/bluetooth/ble_uart_service/main/Kconfig.projbuild b/examples/bluetooth/ble_uart_service/main/Kconfig.projbuild new file mode 100644 index 00000000000..8ffa24ed029 --- /dev/null +++ b/examples/bluetooth/ble_uart_service/main/Kconfig.projbuild @@ -0,0 +1,47 @@ +menu "BLE UART service example" + + config EXAMPLE_CUSTOM_ADV_DATA + bool "Use custom advertising data" + default n + help + Demonstrates `ble_uart_config_t::adv_data` — the field that + lets the application fully control the advertising payload + instead of relying on the library default. + + When enabled, the example passes a static byte array + (`example_adv_payload[]` defined at the top of `main.c`) to + `ble_uart_install()`. Edit that array to broadcast anything + you want: a different Local Name, Manufacturer Specific + Data, custom Service Data, multiple Service UUIDs, etc. + + Format + The array is a sequence of standard Bluetooth Core "AD + structure" triplets: + + [length(1)] [AD type(1)] [value(length-1)] + + See the Bluetooth Assigned Numbers (Generic Access + Profile) document for the full type list. + + Length budget + Total bytes in the array must be + ≤ BLE_UART_ADV_DATA_MAX (28). The 3-byte mandatory + Flags AD element is prepended automatically by + ble_uart and does NOT count against this budget. An + oversized buffer makes `ble_uart_install()` fail with + BLE_UART_EINVAL. + + Scope + Only affects the over-the-air advertising payload. + The GAP-service Device Name (UUID 0x2A00, set via + `device_name` in the same struct) is independent and + stays whatever the application configured — connected + centrals read that name regardless of what is in + `adv_data`. + + Default value + Off. The library default is used (Complete Local Name + in the primary packet, 128-bit Service UUID in the + scan response). + +endmenu diff --git a/examples/bluetooth/ble_uart_service/main/main.c b/examples/bluetooth/ble_uart_service/main/main.c index 0726b9efde5..b209bfb5782 100644 --- a/examples/bluetooth/ble_uart_service/main/main.c +++ b/examples/bluetooth/ble_uart_service/main/main.c @@ -8,6 +8,7 @@ * writes to the RX characteristic is echoed back over TX. */ +#include #include #include "esp_log.h" @@ -17,6 +18,41 @@ #include "ble_uart.h" +#if CONFIG_EXAMPLE_CUSTOM_ADV_DATA +/* Sample advertising payload demonstrating ble_uart_config_t::adv_data. + * Replace these bytes with whatever your product needs (a different + * Local Name, Manufacturer Specific Data, custom Service Data, + * additional Service UUIDs, ...) — ble_uart broadcasts them verbatim. + * + * Format: a sequence of standard BT Core "AD structure" triplets, + * [length(1)] [AD type(1)] [value(length-1)]. + * + * Length budget: total ≤ BLE_UART_ADV_DATA_MAX (28). The mandatory + * 3-byte Flags AD is prepended by ble_uart and does NOT count against + * this budget; oversize fails ble_uart_install() with EINVAL. + * + * The current contents (purely illustrative — edit freely): + * + * Layout bytes + * -------------------------------------- ----- + * Complete Local Name AD "BleUart" 1 + 1 + 7 = 9 + * Complete 128-bit UUID AD 1 + 1 + 16 = 18 + * -------------------------------------- ----- + * total 27 (≤ 28) + */ +static const uint8_t example_adv_payload[] = { + /* AD type 0x09: Complete Local Name */ + 0x08, 0x09, 'B', 'l', 'e', 'U', 'a', 'r', 't', + + /* AD type 0x07: Complete List of 128-bit Service UUIDs. + * UUID bytes are in over-the-air (little-endian) order, matching + * ble_uart_service_uuid.bytes[]. */ + 0x11, 0x07, + 0x9e, 0xca, 0xdc, 0x24, 0x0e, 0xe5, 0xa9, 0xe0, + 0x93, 0xf3, 0xa3, 0xb5, 0x01, 0x00, 0x40, 0x6e, +}; +#endif + static const char *TAG = "app"; static void ble_uart_on_rx(const uint8_t *data, size_t len) @@ -29,6 +65,83 @@ static void ble_uart_on_rx(const uint8_t *data, size_t len) ble_uart_tx(data, len); /* echo back */ } +/* Lifecycle / link-state event sink. Runs on the BLE host task — + * keep it short, never call ble_uart_close()/uninstall() from here. + * + * For production code: gate any sensitive TX on + * BLE_UART_EVT_LINK_SECURE (encrypted+authenticated) instead of just + * "connected"; ble_uart_is_connected() returns true while the link is + * still plaintext during the pairing window. */ +static void ble_uart_on_event(const ble_uart_evt_t *e) +{ + switch (e->id) { + case BLE_UART_EVT_CONNECTED: { + const uint8_t *b = e->connected.peer.bytes; + ESP_LOGI(TAG, + "evt: connected peer=%02x:%02x:%02x:%02x:%02x:%02x type=%u", + b[0], b[1], b[2], b[3], b[4], b[5], e->connected.peer.type); + break; + } + case BLE_UART_EVT_DISCONNECTED: + ESP_LOGI(TAG, "evt: disconnected reason=0x%x", + e->disconnected.reason); + break; + case BLE_UART_EVT_SUBSCRIBED: + ESP_LOGI(TAG, "evt: %ssubscribed", + e->subscribed.subscribed ? "" : "un"); + break; + case BLE_UART_EVT_LINK_SECURE: + ESP_LOGI(TAG, "evt: link_secure enc=%d auth=%d bond=%d ks=%u", + e->link_secure.encrypted, e->link_secure.authenticated, + e->link_secure.bonded, e->link_secure.key_size); + break; + case BLE_UART_EVT_PASSKEY_DISPLAY: + ESP_LOGI(TAG, "evt: passkey=%06" PRIu32, e->passkey.passkey); + break; + case BLE_UART_EVT_PASSKEY_REQUEST: + /* Fires only when cfg.security.io_cap is KEYBOARD_ONLY or + * KEYBOARD_DISPLAY (this example leaves io_cap at AUTO → + * DisplayOnly, so it should not fire). For a real keypad + * product, prompt the user for the 6 digits the central + * displayed and feed them in: + * + * ble_uart_passkey_reply(digits); + * + * See PORTING.md §5.6.1 for the full pattern. */ + ESP_LOGW(TAG, "evt: passkey entry requested — no UI wired in this " + "example (see PORTING.md §5.6.1)"); + break; + case BLE_UART_EVT_NUMERIC_COMPARE: + /* Fires only when cfg.security.io_cap is DISPLAY_YES_NO or + * KEYBOARD_DISPLAY (likewise dormant in this example). For a + * product with a yes/no control, surface the digits to the + * user and resolve the comparison: + * + * ble_uart_compare_reply(user_says_match); + * + * See PORTING.md §5.6.1. */ + ESP_LOGW(TAG, "evt: numeric compare %06" PRIu32 + " — no yes/no UI wired (see PORTING.md §5.6.1)", + e->numeric_compare.passkey); + break; + case BLE_UART_EVT_PAIRING_FAILED: + ESP_LOGW(TAG, "evt: pairing failed reason=0x%x", + e->pairing_failed.reason); + break; + case BLE_UART_EVT_CLOSED: + /* Only after ble_uart_close_async(). This example does not use + * close_async; do not ble_uart_uninstall() here — defer to an + * app task (PORTING.md §5.3.2). Kept for -Wswitch. */ + if (e->closed.status == BLE_UART_OK) { + ESP_LOGI(TAG, "evt: closed (async-close succeeded)"); + } else { + ESP_LOGW(TAG, "evt: closed async-close failed status=%d", + e->closed.status); + } + break; + } +} + void app_main(void) { /* NVS is required by the BT controller (PHY calibration) and the @@ -49,15 +162,51 @@ void app_main(void) ESP_LOGW(TAG, "esp_read_mac(BT) failed (%s); device name suffix will be 0000", esp_err_to_name(mac_err)); } - char name[24]; + char name[BLE_UART_DEVICE_NAME_MAX + 1]; snprintf(name, sizeof(name), "%s-%02X%02X", CONFIG_BLE_UART_DEVICE_NAME_PREFIX, mac[4], mac[5]); ESP_ERROR_CHECK(ble_uart_install(&(ble_uart_config_t){ .encrypted = true, .device_name = name, +#if CONFIG_EXAMPLE_CUSTOM_ADV_DATA + /* Hand the application-defined bytes to ble_uart. Whatever + * the array contains is broadcast verbatim; what `device_name` + * (above) holds is exposed via the GAP service for connected + * centrals to read — independent paths. */ + .adv_data = example_adv_payload, + .adv_data_len = sizeof(example_adv_payload), + /* scan_rsp_data is left at its default (NULL) → ble_uart still + * sends its built-in scan response. Override it the same way + * if you want to control those bytes too. */ +#endif .ble_uart_on_rx = ble_uart_on_rx, + .on_event = ble_uart_on_event, })); + /* Demonstrate the bond-management API: list every bonded peer + * already on flash. Replace the log with `ble_uart_clear_bonds()` + * to wipe them at boot (e.g. when a "factory reset" GPIO is held); + * use `ble_uart_remove_peer(&list[i])` to target one specifically. */ + size_t total = 0; + ble_uart_addr_t list[8]; + int rc = ble_uart_get_bonded_peers(list, sizeof(list) / sizeof(list[0]), + &total); + if (rc == 0) { + ESP_LOGI(TAG, "%u peer(s) currently bonded", (unsigned)total); + size_t shown = total < sizeof(list) / sizeof(list[0]) + ? total : sizeof(list) / sizeof(list[0]); + for (size_t i = 0; i < shown; i++) { + const uint8_t *b = list[i].bytes; + ESP_LOGI(TAG, " [%u] %02x:%02x:%02x:%02x:%02x:%02x type=%u", + (unsigned)i, + b[0], b[1], b[2], b[3], b[4], b[5], list[i].type); + } + if (total > shown) { + ESP_LOGI(TAG, " (%u more not shown)", + (unsigned)(total - shown)); + } + } + ESP_ERROR_CHECK(ble_uart_open()); } diff --git a/examples/bluetooth/ble_uart_service/sdkconfig.ci.bluedroid b/examples/bluetooth/ble_uart_service/sdkconfig.ci.bluedroid new file mode 100644 index 00000000000..fcb8571707e --- /dev/null +++ b/examples/bluetooth/ble_uart_service/sdkconfig.ci.bluedroid @@ -0,0 +1,24 @@ +# CI build overlay: Bluedroid host (sdkconfig.defaults selects NimBLE). +# Mirrors sdkconfig.bluedroid; kept in sync for idf-build-apps CONFIG_NAME=bluedroid. + +CONFIG_BT_NIMBLE_ENABLED=n +CONFIG_BT_ENABLED=y + +CONFIG_BT_NIMBLE_ENABLED=n +CONFIG_BT_BLUEDROID_ENABLED=y + +CONFIG_BT_BLE_SMP_ENABLE=y + + +CONFIG_BT_GATTS_ENABLE=y + +# CONFIG_BT_GATTC_ENABLE is not set + +# CONFIG_BT_BLE_50_FEATURES_SUPPORTED is not set +CONFIG_BT_BLE_42_FEATURES_SUPPORTED=y + +# CONFIG_BT_BLE_42_DTM_TEST_EN is not set + +CONFIG_BT_BLE_42_ADV_EN=y + +# CONFIG_BT_BLE_42_SCAN_EN is not set diff --git a/examples/bluetooth/ble_uart_service/sdkconfig.ci.nimble b/examples/bluetooth/ble_uart_service/sdkconfig.ci.nimble new file mode 100644 index 00000000000..b28da057406 --- /dev/null +++ b/examples/bluetooth/ble_uart_service/sdkconfig.ci.nimble @@ -0,0 +1,7 @@ +# CI build overlay: NimBLE host (sdkconfig.defaults is NimBLE-first). +# Explicit config so idf-build-apps builds both nimble and bluedroid in CI. + +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_BT_BLUEDROID_ENABLED=n +CONFIG_BT_NIMBLE_SM_SC=y +CONFIG_BT_NIMBLE_NVS_PERSIST=y diff --git a/examples/bluetooth/common/ble_uart/PORTING.md b/examples/bluetooth/common/ble_uart/PORTING.md index e090f31a13f..bea60be19bc 100644 --- a/examples/bluetooth/common/ble_uart/PORTING.md +++ b/examples/bluetooth/common/ble_uart/PORTING.md @@ -8,9 +8,10 @@ This document lives in **`examples/bluetooth/common/ble_uart/`** next to the **Reference application:** use the **`examples/bluetooth/ble_uart_service`** example as the working template. Its root `CMakeLists.txt` appends this directory to **`EXTRA_COMPONENT_DIRS`** so `main` can `REQUIRES ble_uart`; -`main/main.c` initializes NVS and a MAC-derived GAP name, calls -`ble_uart_install()` / `ble_uart_open()` with the default encrypted UART-over-BLE echo -path, and the tree ships `sdkconfig.defaults` plus the Bluedroid overlay +`main/main.c` initializes NVS, calls `ble_uart_install()` / +`ble_uart_open()` with the Kconfig-supplied GAP name and the default +encrypted UART-over-BLE echo path, and the tree ships +`sdkconfig.defaults` plus the Bluedroid overlay (`sdkconfig.bluedroid`). Clone or diff that project when adapting to a new target or host stack. @@ -61,7 +62,7 @@ is entirely up to you**. Canonical sources live under **`$IDF_PATH/examples/bluetooth/common/ble_uart/`** (component name `ble_uart`): `ble_uart.h`, `ble_uart_nimble.c`, -`ble_uart_bluedroid.c`, `CMakeLists.txt`, and `Kconfig` (prefix + RX scratch; +`ble_uart_bluedroid.c`, `CMakeLists.txt`, and `Kconfig` (device name + RX scratch; `menuconfig → Component configuration → ESP-BLE-UART library`). When reusing outside this tree, copy the whole `common/ble_uart/` directory or at least merge `Kconfig` into your component so the same `CONFIG_BLE_UART_*` symbols @@ -264,17 +265,32 @@ back. ```c typedef struct { - bool encrypted; /* Master switch for SC + Bonding + MITM */ - const char *device_name; /* GAP device name; NULL uses the NimBLE default */ - ble_uart_rx_cb_t ble_uart_on_rx;/* RX byte callback */ + bool encrypted; /* Preset shortcut for SC + Bonding + MITM */ + ble_uart_security_t security; /* Per-feature overrides — see §5.6 */ + + const char *device_name; /* GAP service device name (UUID 0x2A00) */ + + /* Custom advertising bytes — see §5.9. NULL keeps the default + * payload. ble_uart prepends the 3-byte Flags AD itself; you don't. */ + const uint8_t *adv_data; + size_t adv_data_len; /* ≤ BLE_UART_ADV_DATA_MAX (28) */ + const uint8_t *scan_rsp_data; + size_t scan_rsp_data_len;/* ≤ BLE_UART_SCAN_RSP_DATA_MAX (31) */ + + ble_uart_rx_cb_t ble_uart_on_rx;/* RX byte callback */ + ble_uart_evt_cb_t on_event; /* Lifecycle / link-state events */ } ble_uart_config_t; ``` | Field | Type | Required | Default / meaning | | --- | --- | --- | --- | -| `encrypted` | `bool` | yes | `true` = SC + Bonding + MITM + DisplayOnly + encrypted GATT chars; `false` = fully plaintext (sniffable, lab use only) | -| `device_name` | `const char *` | recommended | Any string. Mind the 31-byte primary advertising packet limit: flags(3) + tx_pwr(3) + name(2 + length) + 128-bit UUID(18) → keep the name ≤ 8 bytes | +| `encrypted` | `bool` | yes | One-line preset for the override fields under `security`: `true` = SC + Bonding + MITM + DisplayOnly + encrypted+authenticated GATT chars; `false` = fully plaintext (sniffable, lab use only). Override individual bits via `security.*` — see §5.6. | +| `security` | `ble_uart_security_t` | optional | A zero-initialised member (`security.{sc,bonding,mitm,io_cap} = AUTO`) inherits everything from `encrypted`. Set any sub-field to `OFF`/`ON` (or pick a specific `io_cap`) to override just that bit. Out-of-range enum values, or impossible combos like `mitm=ON` with `io_cap=NO_INPUT_OUTPUT`, fail `ble_uart_install()` with `BLE_UART_EINVAL`. Full reference in §5.6. | +| `device_name` | `const char *` | recommended | Set as the GAP-service Device Name (UUID 0x2A00). With the **default** advertising payload it is also placed in the primary adv as the Complete Local Name; with custom `adv_data` (see §5.9) it is **not** auto-included — the application owns the adv bytes. Length must be ≤ **`BLE_UART_DEVICE_NAME_MAX` = 26** (sized so the default Flags + Name AD layout always fits in a 31-byte primary packet). Longer names fail `ble_uart_install()` synchronously with `BLE_UART_EINVAL`. | +| `adv_data` / `adv_data_len` | bytes + length | optional | Application-controlled raw advertisement data. NULL keeps the built-in default (Complete Local Name only). Max length **`BLE_UART_ADV_DATA_MAX` = 28** (the 31-byte primary packet minus our 3-byte Flags AD). Buffer is copied in `install`; the pointer doesn't need to outlive the call. See §5.9. | +| `scan_rsp_data` / `scan_rsp_data_len` | bytes + length | optional | Application-controlled raw scan-response data. NULL keeps the built-in default (128-bit BLE UART service UUID). Max length **`BLE_UART_SCAN_RSP_DATA_MAX` = 31** (no Flags element here). Same copy semantics as `adv_data`. | | `ble_uart_on_rx` | callback | optional | `NULL` discards every received byte | +| `on_event` | callback | optional | `NULL` drops every event (see §5.2.1). **Not required** for the default preset (`encrypted=true`, all `security.*` AUTO → Passkey Display): the port logs the 6-digit passkey to UART and completes pairing without a callback. **Required** when `io_cap` is `KEYBOARD_ONLY`, `DISPLAY_YES_NO`, or `KEYBOARD_DISPLAY` — otherwise `ble_uart_install()` returns `BLE_UART_EINVAL`. | ### 5.2 RX callback signature @@ -290,50 +306,322 @@ static void my_handler(const uint8_t *data, size_t len) **Caveats**: -- The callback runs in the **NimBLE host task** context — **do not - block**; offload heavy work to your own task. +- The callback runs on the BLE host task (NimBLE host task / + Bluedroid BTC task) — **do not block**; offload heavy work to your + own task. - A single callback may carry only **part** of an upper-layer frame (the central slices on ATT MTU). Framing logic (line / TLV / length-prefixed) is your responsibility. - The data carries **no `ctx` argument**. If your callback needs state, use a file-scope `static` or a global. -### 5.3 Lifecycle functions +### 5.2.1 Event callback + +```c +typedef void (*ble_uart_evt_cb_t)(const ble_uart_evt_t *evt); + +static void on_event(const ble_uart_evt_t *e) +{ + switch (e->id) { + case BLE_UART_EVT_CONNECTED: /* link up */ break; + case BLE_UART_EVT_DISCONNECTED: /* e->disconnected.reason */ break; + case BLE_UART_EVT_SUBSCRIBED: /* e->subscribed.subscribed */ break; + case BLE_UART_EVT_LINK_SECURE: + if (e->link_secure.encrypted && e->link_secure.authenticated) { + /* Safe to forward sensitive payloads now */ + } + break; + case BLE_UART_EVT_PASSKEY_DISPLAY: /* e->passkey.passkey */ break; + case BLE_UART_EVT_PASSKEY_REQUEST: /* user types peer's 6-digit; + ble_uart_passkey_reply(d) */ break; + case BLE_UART_EVT_NUMERIC_COMPARE: /* e->numeric_compare.passkey, + ble_uart_compare_reply(b) */ break; + case BLE_UART_EVT_PAIRING_FAILED: /* e->pairing_failed.reason */ break; + } +} +``` + +| `evt->id` | Payload (anonymous-union member) | Fires when | +| --- | --- | --- | +| `BLE_UART_EVT_CONNECTED` | — | Physical link up | +| `BLE_UART_EVT_DISCONNECTED` | `disconnected.reason` (int, stack-specific) | Physical link down — Bluedroid: `esp_gatt_conn_reason_t`; NimBLE: BLE host return code (`BLE_HS_HCI_ERR()` for HCI) | +| `BLE_UART_EVT_SUBSCRIBED` | `subscribed.subscribed` | CCCD on TX changed (edge-triggered) | +| `BLE_UART_EVT_LINK_SECURE` | `link_secure.{encrypted,authenticated,bonded,key_size}` | Pairing or bonded reconnect succeeds | +| `BLE_UART_EVT_PASSKEY_DISPLAY` | `passkey.passkey` (0..999999) | SM generated a passkey for the central to type (Passkey Display). **Optional** — the port always prints a banner to UART; with `on_event == NULL` the event is dropped and pairing still completes (NimBLE injects the passkey internally; Bluedroid needs no app reply). Register `on_event` only if you want a custom UI in addition to the log line. | +| `BLE_UART_EVT_PASSKEY_REQUEST` | — | SM asks the user to enter a passkey shown by the central — application **must** reply via `ble_uart_passkey_reply()` (see §5.6.1). Requires `on_event != NULL` at install time. | +| `BLE_UART_EVT_NUMERIC_COMPARE` | `numeric_compare.passkey` (0..999999) | SM asks the user to confirm the displayed value matches the central — application **must** reply via `ble_uart_compare_reply()` (see §5.6.1). Requires `on_event != NULL` at install time. | +| `BLE_UART_EVT_PAIRING_FAILED` | `pairing_failed.reason` | Pairing rejected or timed out (including no application reply for `PASSKEY_REQUEST` / `NUMERIC_COMPARE` before the SM's pairing timeout) | +| `BLE_UART_EVT_CLOSED` | `closed.status` (`BLE_UART_*` from the worker's `ble_uart_close()`) | `ble_uart_close_async()` worker finished — then `uninstall` on an app task (§5.3.2) | + +**Use `LINK_SECURE`, not `is_connected()`, to gate any logic that +requires the link to be encrypted / authenticated** — bare +`is_connected()` returns `true` while the link is still plaintext, and +inferring security from `encrypted` / `authenticated` separately on the +caller side is exactly the kind of leak the callback is designed to +plug. + +**Threading**: same context and rules as `ble_uart_on_rx` (NimBLE host +task / Bluedroid BTC task). Don't block, don't call `ble_uart_close` / +`ble_uart_uninstall` from inside the callback — use +`ble_uart_close_async()` (§5.3.2) if you need to teardown in response +to an event. + +**Exception — `BLE_UART_EVT_CLOSED`**: this single event fires from +the close-async worker task instead of the BLE host task; by the time +it runs the host task is already gone. Keep the handler short: set a +flag or notify an app task — do **not** call `ble_uart_uninstall()` +here (see §5.3.2). The worker clears `s_closing` only after your +handler returns. + +**Ordering contracts (both backends)**: + +- A single CCCD value change fires exactly one `SUBSCRIBED` event + (edge-triggered — repeating the same write is a no-op). +- If the central was subscribed at the moment the link drops, you get + `SUBSCRIBED(false)` **before** `DISCONNECTED`. NimBLE does this + natively (`BLE_GAP_SUBSCRIBE_REASON_TERM`); the Bluedroid backend + synthesizes the same sequence so consumers can write a single state + machine that works on either host. +- `LINK_SECURE` always arrives after `CONNECTED` — pairing can't run + without a link. +- `BLE_UART_EVT_CLOSED` always arrives **after** + `BLE_UART_EVT_DISCONNECTED` (when there was a peer) — the + close-async worker calls the same disconnect+wait sequence as the + synchronous `ble_uart_close()` before firing CLOSED. + +**Backend differences**: + +- `BLE_UART_EVT_LINK_SECURE.key_size`: NimBLE reports the negotiated + size (7..16); Bluedroid surfaces a fixed 16 — Bluedroid sets + `ESP_BLE_SM_MAX_KEY_SIZE=16` at install time and does not expose the + negotiated size on `AUTH_CMPL`. +- Bonded reconnects: NimBLE re-fires `LINK_SECURE` on every encryption + change; Bluedroid only fires `AUTH_CMPL_EVT` when the SM exchange + actually runs, so a pure LTK-restart may not refire the event. +- CCCD persistence on bonded reconnect: NimBLE re-fires + `SUBSCRIBED(true)` automatically (via `BLE_GAP_SUBSCRIBE_REASON_RESTORE`) + when the bonded peer reconnects; Bluedroid does not persist CCCD + across connections, so the central has to write CCCD again to + resubscribe. + +### 5.3 Lifecycle — bring-up and release + +#### API summary ```c int ble_uart_install(const ble_uart_config_t *cfg); int ble_uart_open(void); int ble_uart_close(void); +int ble_uart_close_async(void); /* fire-and-forget, see §5.3.2–5.3.4 */ int ble_uart_uninstall(void); ``` | Function | What it does (NimBLE) | What it does (Bluedroid) | When to call | Blocking? | | --- | --- | --- | --- | --- | | `install` | `nimble_port_init` + `ble_hs_cfg` + SM + SIG services + UART GATT | `controller_init/enable` + `bluedroid_init/enable` + SM + `esp_ble_gatts_create_attr_tab` (waits ≤500 ms for the attr-table event) | After `nvs_flash_init()`, before `open` | No, ~50 ms (NimBLE) / ~150 ms (Bluedroid) | -| `open` | Bond store + spawn host task + start advertising once synced | Configure adv data + scan rsp + start advertising | After `install` | No, host runs in the background | -| `close` | Stop adv → graceful disconnect (LL_TERMINATE_IND, waits ≤500 ms for the disconnect event) → `nimble_port_stop()` | Stop adv → graceful disconnect (`esp_ble_gap_disconnect`, waits ≤500 ms) | After `open`, before `uninstall` | Yes, up to ~500 ms while waiting for the peer disconnect | -| `uninstall` | Calls `close` if still open, then `nimble_port_deinit()` and resets module state | Calls `close` if still open, then `bluedroid_disable+deinit` + `controller_disable+deinit` | After `close` (or directly — `uninstall` cascades into `close` on its own) | Yes, follows the same wait window as `close` | +| `open` | Spawn host task + `ble_hs_start` (first time via `BLE_HS_AUTO_START`, later via `ble_hs_sched_start`) + advertising once synced; after a prior `close`, re-queues GAP/GATT/UART svc defs (§5.3.1a) | Configure adv data + scan rsp + start advertising (GATT table from `install` stays up) | After `install` | No, host runs in the background | +| `close` | Stop adv → graceful disconnect (≤500 ms) → `nimble_port_stop()` → `ble_gatts_reset()` | Stop adv → graceful disconnect (≤500 ms); host + GATT table stay up | After `open`, before `uninstall`; **not** from host-task callbacks (§5.3.2) | Yes, up to ~500 ms (NimBLE) | +| `close_async` | Worker runs the same body as `close`, then `BLE_UART_EVT_CLOSED` | Same | From `on_event` / `on_rx` (host task) when sync `close` would deadlock | No (returns once worker is spawned) | +| `uninstall` | `close` if still open (+ poll in-flight `close_async` ≤~5 s), then `nimble_port_deinit`, wipe module state | Same + controller deinit | After the radio is fully closed (§5.3.2); **not** from host-task callbacks | Yes | -Call order: +**Bring-up** (every product): -``` -nvs_flash_init - └── ble_uart_install - └── ble_uart_open ← BLE is live - └── ble_uart_close - └── ble_uart_uninstall ← clean state, can install again +```text +nvs_flash_init() + └── ble_uart_install(&cfg) /* once per uninstall cycle */ + └── ble_uart_open() /* advertising + pairing; BLE is live */ ``` -Each call returns `BLE_HS_EALREADY` if the corresponding state is -already true (e.g. `open` called twice, or `close` called when the -radio is already down). It is therefore safe to call `close` / -`uninstall` defensively at shutdown without checking the current state -yourself. +Run-forever firmware can stop here — no `close` / `uninstall` required. -**Do NOT call `close` / `uninstall` from inside `ble_uart_on_rx`** — -that callback runs on the NimBLE host task, and `close` blocks on -`nimble_port_stop()` which expects the host task to exit. Self-stop -deadlocks. Forward the request to a normal FreeRTOS task instead. +**Release** — pick **one** path below. `close` stops the radio but keeps +`install` state (you can `open()` again). `uninstall` tears the host + +controller down so `install()` can run from scratch. + +| Goal | Call sequence | Who calls `close` / `uninstall` | +| --- | --- | --- | +| Power BLE off from a **normal app task** (button, Wi-Fi, `app_main` shutdown) | `ble_uart_close()` → `ble_uart_uninstall()` | That app task only | +| Power BLE off **because of a BLE event** (RX command, failed pairing, policy) | `ble_uart_close_async()` in `on_event` / `on_rx` → wait for `BLE_UART_EVT_CLOSED` → `ble_uart_uninstall()` on an **app task** (§5.3.2) | `close_async` in callback; `uninstall` deferred | + +Each API returns `BLE_UART_EALREADY` when the module is already in the +target state, so defensive `close` / `uninstall` at shutdown without +manual state checks is fine **as long as** you follow the release path +for your scenario. + +#### 5.3.1 Path A — synchronous release (recommended default) + +Use when teardown is **not** triggered from inside `on_event` / +`on_rx` (NimBLE host task / Bluedroid BTC task). This is what the +`ble_uart_service` example does. + +```c +void shutdown_ble_from_app_task(void) +{ + int rc; + + rc = ble_uart_close(); + if (rc != BLE_UART_OK && rc != BLE_UART_EALREADY) { + ESP_LOGE(TAG, "ble_uart_close rc=%d", rc); + } + + rc = ble_uart_uninstall(); + if (rc != BLE_UART_OK && rc != BLE_UART_EALREADY) { + ESP_LOGE(TAG, "ble_uart_uninstall rc=%d", rc); + } + /* BLE UART fully released — safe to ble_uart_install() again */ +} +``` + +```text +ble_uart_open() /* running */ + │ + ▼ +ble_uart_close() /* same app task; not from on_event / on_rx */ + │ + ▼ +ble_uart_uninstall() +``` + +- `uninstall` may call `close` internally if you skipped `close` — still + call both explicitly so return codes are obvious in your logs. +- Do **not** call `close` or `uninstall` from `on_event` / `on_rx` — use + Path B instead. + +#### 5.3.1a Pausing and resuming (`close` then `open` again) + +`install` state is preserved across `close()` — you may call `open()` +again without `uninstall()`. This is what the `ble_uart_service` example +exercises in `app_main` (open → close → open) to prove the cycle. + +**NimBLE backend** + +| Topic | Behaviour | +| --- | --- | +| GATT services | Same set as after `install`: GAP (`0x1800`), GATT (`0x1801`), BLE UART (NUS). `close()` calls the public `ble_gatts_reset()`; the next `open()` re-runs `ble_svc_gap_init()`, `ble_svc_gatt_init()`, and re-adds the UART service. | +| ATT handles | **Not stable** — centrals must run a full service discovery after each reconnect; do not cache handles across a `close`/`open` cycle. | +| Subscriptions | Cleared — the central must re-enable TX notifications (CCCD). | +| Bonds | NVS bond store is unchanged (still configured at `install()`). | +| First vs later `open` | With default `BLE_HS_AUTO_START`, the first `open()` consumes the one-shot auto-start queued by `nimble_port_init()`; every later `open()` must call `ble_hs_sched_start()` (handled inside `ble_uart_open()`). | + +**Bluedroid backend** + +`close()` only stops advertising and disconnects; the host and attribute +table created at `install()` stay registered. A second `open()` restarts +advertising. GATT handles are typically unchanged. + +**Extra GATT services (§6.3)** + +Services you register with `ble_gatts_add_svcs()` / `ble_svc_*_init()` +at `install()` time are **not** automatically re-registered by +`ble_uart` on a later `open()` after `close()` (NimBLE only re-adds +GAP, GATT, and UART). Either call your init/add functions again inside +your own `open()` hook after `ble_uart_close()`, or use +`close()` → `uninstall()` → `install()` → `open()` for a full rebuild. + +#### 5.3.2 Path B — release after a BLE event (`close_async`) + +Use when the **reason** to shut down arrives on the host task (e.g. +`BLE_UART_EVT_PAIRING_FAILED`, an RX “power off” byte, or +`LINK_SECURE` policy). Synchronous `close()` deadlocks there; use +`close_async()` and **defer** `uninstall()` to a normal task. + +```c +static volatile bool s_ble_closed_ok; + +static void on_event(const ble_uart_evt_t *e) +{ + switch (e->id) { + case BLE_UART_EVT_PAIRING_FAILED: + ble_uart_close_async(); /* OK: host-task context */ + break; + + case BLE_UART_EVT_CLOSED: + /* Runs on the close-async worker — keep this short. Do NOT call + * ble_uart_uninstall() here (s_closing is still set; see §5.3.3). */ + if (e->closed.status == BLE_UART_OK) { + s_ble_closed_ok = true; /* or xTaskNotifyGive / queue */ + } + break; + default: + break; + } +} + +void ble_shutdown_task(void *arg) +{ + (void)arg; + for (;;) { + if (s_ble_closed_ok) { + s_ble_closed_ok = false; + ble_uart_uninstall(); /* normal app task */ + break; + } + vTaskDelay(pdMS_TO_TICKS(50)); + } + vTaskDelete(NULL); +} +``` + +```text +on_event / on_rx (host task): + ble_uart_close_async() + │ + ▼ + [worker: do_close ≈ sync close] + │ + ├── BLE_UART_EVT_DISCONNECTED (if peer was connected) + └── BLE_UART_EVT_CLOSED (worker task; set flag only) + │ + ▼ +app task (not host, not inside CLOSED handler): + ble_uart_uninstall() +``` + +- `close_async` returns `BLE_UART_OK` once the worker is **spawned**, not + when close finishes. +- Only `BLE_UART_EVT_CLOSED` with `.closed.status == BLE_UART_OK` means + the same quiesced state as `ble_uart_close()` — then it is safe to + `uninstall()` from your app task. +- On failure (`BLE_UART_EFAIL`, etc.) the port may still be open; retry + `ble_uart_close()` / `ble_uart_close_async()` from an app task. + +#### 5.3.3 `close_async` + `uninstall` — rules and pitfalls + +`ble_uart_uninstall()` **polls** an in-flight `close_async` worker for +up to **~5 s**. If the worker has not exited it logs +`uninstall: close_async worker still running, tearing down anyway` and +continues anyway — treat that as an application bug, not a supported +path. + +| Do | Don't | +| --- | --- | +| `close_async()` in `on_event` / `on_rx`; `uninstall()` later on **one** app task after `CLOSED` + `BLE_UART_OK` | `uninstall()` in the same task right after `close_async()` without waiting | +| Set a flag / queue in `BLE_UART_EVT_CLOSED`; return immediately | `ble_uart_uninstall()` **inside** `BLE_UART_EVT_CLOSED` (worker still holds `s_closing`) | +| Sync `close` + `uninstall` from a button / network task | `close` / `uninstall` from host-task callbacks | +| Keep `on_event` / `on_rx` short while a close is in flight | Multi-second blocking in callbacks during `close_async` | +| After a timeout log, fix ordering before `install()` again | Immediate `install()` + `open()` + `close_async()` after a wedged teardown | + +If you see `uninstall: close_async worker still running, tearing down +anyway`, fix call ordering (§5.3.2) before calling `install()` again. + +#### 5.3.4 `ble_uart_close_async()` — reference + +Some applications need to teardown the radio in response to a BLE +event — examples: a "shutdown" command on RX, a `LINK_SECURE` whose +flags don't meet the application's policy, or a `PAIRING_FAILED` from +a peer that's been blacklisted. Because the synchronous `close()` is +called *from* the host task it would normally run on, calling it +inline would deadlock. `close_async()` papers over that: it spawns a +small worker task (~3 KB stack, idle+2 priority) that runs the same +close body, then signals completion via the event callback. + +**Behaviour** (see §5.3.2 for the full release flow): + +- `close_async` returns `BLE_UART_OK` once the worker has been spawned. +- `BLE_UART_EVT_DISCONNECTED` (if connected) then `BLE_UART_EVT_CLOSED` + with `.closed.status` — same ≤500 ms disconnect window as sync `close`. +- Second call while draining → `BLE_UART_EALREADY`; before `open` → + `BLE_UART_EALREADY`; spawn failure → `BLE_UART_ENOMEM` (latch reset). ### 5.4 TX interface @@ -354,11 +642,11 @@ ble_uart_tx((const uint8_t *)line, (size_t)n); | Return | Meaning | | --- | --- | -| `0` | Success (notification handed to the stack) | -| `BLE_HS_ENOTCONN` | No central connected; **this is normal — typically ignore** | -| `BLE_HS_EINVAL` | `data == NULL` or `len == 0` | -| `BLE_HS_ENOMEM` | Stack mbuf pool exhausted | -| other | Internal stack error — see `ble_hs.h` | +| `BLE_UART_OK` | Success (notification handed to the stack) | +| `BLE_UART_ENOTCONN` | No central connected; **this is normal — typically ignore** | +| `BLE_UART_EINVAL` | `data == NULL` or `len == 0` | +| `BLE_UART_ENOMEM` | Stack mbuf pool exhausted | +| `BLE_UART_EFAIL` | Internal stack error — see logs | **Calling context**: any FreeRTOS task at any priority. **Not callable from an ISR** — push the data to a queue from the ISR and let a task @@ -382,16 +670,425 @@ bool ble_uart_is_subscribed(void); You usually **don't need** to query these up-front — `ble_uart_tx` returns `ENOTCONN` to tell you. -### 5.6 Service UUID constant +### 5.6 Security configuration + +`cfg.encrypted` is a one-line **preset** that turns on every part of +the stack's security toolbox at once — LE Secure Connections, bonding +(LTK persisted in NVS), MITM protection, DisplayOnly IO, and the +`_ENC | _AUTHEN` flags on the GATT characteristics. It maps to the +older two-state behaviour and is what the "secure by default" template +in §4.4 picks. + +For applications that need finer control — a displayless gateway that +still wants encrypted bonding, a one-shot encrypted session that +doesn't keep an LTK, an interop test build that disables only MITM — +each component of the preset can be flipped individually through the +`cfg.security` sub-struct: + +```c +typedef enum { + BLE_UART_SEC_AUTO = 0, /* follow cfg.encrypted */ + BLE_UART_SEC_OFF = 1, + BLE_UART_SEC_ON = 2, +} ble_uart_sec_t; + +typedef enum { + BLE_UART_IO_CAP_AUTO = 0, /* DisplayOnly when MITM is on; + NoInputNoOutput when off. + Passkey Display needs no on_event */ + BLE_UART_IO_CAP_NO_INPUT_OUTPUT = 1, /* Just Works only */ + BLE_UART_IO_CAP_DISPLAY_ONLY = 2, /* Passkey Display — UART banner + + optional PASSKEY_DISPLAY; + no on_event required */ + BLE_UART_IO_CAP_KEYBOARD_ONLY = 3, /* Passkey Entry — PASSKEY_REQUEST; + on_event required */ + BLE_UART_IO_CAP_DISPLAY_YES_NO = 4, /* Numeric Comparison; + on_event required */ + BLE_UART_IO_CAP_KEYBOARD_DISPLAY = 5, /* PASSKEY_REQUEST or NUMERIC_COMPARE; + on_event required */ +} ble_uart_io_cap_t; + +typedef struct { + ble_uart_sec_t sc; /* tri-state */ + ble_uart_sec_t bonding; /* tri-state */ + ble_uart_sec_t mitm; /* tri-state */ + ble_uart_io_cap_t io_cap; /* AUTO + the five IO caps above */ +} ble_uart_security_t; +``` + +Each of `cfg.security.{sc,bonding,mitm}` is a tri-state. `AUTO` +(the value of any zero-initialised member) inherits from +`cfg.encrypted`; `OFF` / `ON` override that specific bit only. The +resolution table: + +| `cfg.encrypted` | Override field | Resolved bit | +| --- | --- | --- | +| `true` | `AUTO` | ON | +| `true` | `OFF` | OFF | +| `true` | `ON` | ON | +| `false` | `AUTO` | OFF | +| `false` | `OFF` | OFF | +| `false` | `ON` | ON | + +`cfg.security.io_cap` follows the same `AUTO` / explicit pattern. +The application picks an IO cap matching its UI; the SM combines it +with the central's IO cap to elect the pairing model (see BT Core +Spec §2.3.5.1) and ble_uart fires the matching event: + +| Pairing model | Trigger event | Application response | +| --- | --- | --- | +| Just Works | (none — pairs silently) | — | +| Passkey Display (we show) | `BLE_UART_EVT_PASSKEY_DISPLAY` (optional; UART banner always) | (none — port handles SM reply; central types the digits) | +| Passkey Entry (user types)| `BLE_UART_EVT_PASSKEY_REQUEST` | `ble_uart_passkey_reply(d)` — **`on_event` required** | +| Numeric Comparison | `BLE_UART_EVT_NUMERIC_COMPARE` | `ble_uart_compare_reply(b)` — **`on_event` required** | + +Numeric Comparison additionally requires LE Secure Connections on +both sides (legacy SM doesn't support it); against a legacy peer a +`DISPLAY_YES_NO` / `KEYBOARD_DISPLAY` IO cap falls back to either +Passkey Entry (with our keypad) or Just Works. + +#### What is checked synchronously + +`ble_uart_install()` rejects the following with `BLE_UART_EINVAL` +**before** bringing the host stack up, so misconfigured applications +fail fast and predictably: + +- `cfg.security.{sc,bonding,mitm}` outside `{AUTO, OFF, ON}` +- `cfg.security.io_cap` outside the six values listed above +- Resolved `mitm == ON` together with resolved + `io_cap == NO_INPUT_OUTPUT` — Just Works cannot satisfy MITM and + the SM would otherwise reject pairing in flight +- `cfg.on_event == NULL` together with a **configured** (not resolved) + input-capable `io_cap` — only `KEYBOARD_ONLY`, `DISPLAY_YES_NO`, and + `KEYBOARD_DISPLAY`. Without an event sink the application would never + see `PASSKEY_REQUEST` / `NUMERIC_COMPARE` and pairing would silently + stall until the SM times out. **`AUTO` (even when it resolves to + DisplayOnly because `mitm=ON`), `DISPLAY_ONLY`, and `NO_INPUT_OUTPUT` + do not require `on_event`** — Passkey Display is satisfied inside the + port (UART log + internal SM reply); `PASSKEY_DISPLAY` via `on_event` + is additive only. + +#### How the resolved policy is applied + +| Component | Effect | +| --- | --- | +| Resolved `sc` / `bonding` / `mitm` (any ON) | SM is enabled; `ble_gap_security_initiate` (NimBLE) / `esp_ble_set_encryption` (Bluedroid) runs on connect | +| Resolved `mitm` | `ESP_BLE_SEC_ENCRYPT_MITM` vs `_NO_MITM` (Bluedroid); `_AUTHEN` flag added to GATT chars | +| Any of the three on | Encrypted GATT permission flags (`_ENC` on NimBLE, `_ENCRYPTED` on Bluedroid) | +| All three off | Plain `READ`/`WRITE` permissions; SM disabled | +| Resolved `io_cap` | `BLE_HS_IO_*` (NimBLE) / `ESP_IO_CAP_*` (Bluedroid) | + +#### Common combinations + +```c +/* (a) Default — secure-by-default UART. SC + Bonding + MITM, DisplayOnly. + * on_event may be NULL: passkey is printed to UART and pairing + * completes without PASSKEY_DISPLAY / reply callbacks. */ +ble_uart_install(&(ble_uart_config_t){ + .encrypted = true, + /* security.{sc,bonding,mitm,io_cap} all AUTO → all ON. */ + /* .on_event = NULL — valid for this preset */ +}); + +/* (b) Displayless gateway. SC + Bonding + Just Works (no passkey UI). */ +ble_uart_install(&(ble_uart_config_t){ + .encrypted = true, + .security = { + .mitm = BLE_UART_SEC_OFF, + .io_cap = BLE_UART_IO_CAP_NO_INPUT_OUTPUT, + }, +}); + +/* (c) Encrypted but ephemeral. Re-pair every reconnect, no NVS bond. */ +ble_uart_install(&(ble_uart_config_t){ + .encrypted = true, + .security = { .bonding = BLE_UART_SEC_OFF }, +}); + +/* (d) Plaintext lab build. */ +ble_uart_install(&(ble_uart_config_t){ + .encrypted = false, + /* security.* all AUTO → all OFF. */ +}); + +/* (e) Interop test — keep encryption + bonding, drop MITM only. */ +ble_uart_install(&(ble_uart_config_t){ + .encrypted = true, + .security = { .mitm = BLE_UART_SEC_OFF }, + /* security.io_cap AUTO → NoInputNoOutput once MITM is gone. */ +}); + +/* (f) Passkey Entry — peripheral has a keypad, central has a display. + * User reads the 6-digit code off the central and types it here. + * on_event MUST be set; the application wires PASSKEY_REQUEST to + * a UI prompt and feeds the digits to ble_uart_passkey_reply(). */ +ble_uart_install(&(ble_uart_config_t){ + .encrypted = true, + .security = { .io_cap = BLE_UART_IO_CAP_KEYBOARD_ONLY }, + .on_event = on_event, + ... +}); + +/* (g) Numeric Comparison — peripheral has display + yes/no button. + * Both sides see the same 6-digit value; user confirms match. + * Requires LE Secure Connections (so .sc must be ON, which it is + * by default with .encrypted=true). on_event MUST be set. */ +ble_uart_install(&(ble_uart_config_t){ + .encrypted = true, + .security = { .io_cap = BLE_UART_IO_CAP_DISPLAY_YES_NO }, + .on_event = on_event, + ... +}); + +/* (h) Touchscreen UI — full keypad+display. The SM elects either + * Passkey Entry or Numeric Comparison depending on the central; + * wire BOTH events. */ +ble_uart_install(&(ble_uart_config_t){ + .encrypted = true, + .security = { .io_cap = BLE_UART_IO_CAP_KEYBOARD_DISPLAY }, + .on_event = on_event, + ... +}); +``` + +#### 5.6.1 Pairing reply API + +**Passkey Display (default / `DISPLAY_ONLY` / `AUTO` + `mitm=ON`)** does +not use the reply APIs. The port generates the 6-digit value, logs it, +and drives the SM (NimBLE: `ble_sm_inject_io` on `BLE_SM_IOACT_DISP`; +Bluedroid: no `esp_ble_passkey_reply` needed on `PASSKEY_NOTIF`). You +only need `ble_uart_passkey_reply()` / `ble_uart_compare_reply()` for +the interactive models below. + +`Passkey Entry` and `Numeric Comparison` are interactive — the SM +suspends pairing until the application reports the user's input. +`ble_uart` exposes one reply call per flavour: + +```c +int ble_uart_passkey_reply(uint32_t passkey); /* 0..999999 */ +int ble_uart_compare_reply(bool match); +``` + +Both are safe from any task, return immediately, and accept exactly +one reply per request. Subsequent calls (or calls with no request in +flight) return `BLE_UART_ENOTCONN`. `passkey > 999999` returns +`BLE_UART_EINVAL`. If the user fails to reply before the SM's pairing +timeout (controller default ≈ 30 s), the link surfaces +`BLE_UART_EVT_PAIRING_FAILED` and any later reply is silently dropped. + +```c +static void on_event(const ble_uart_evt_t *e) +{ + switch (e->id) { + case BLE_UART_EVT_PASSKEY_REQUEST: + /* Prompt the user; once digits are entered: */ + ble_uart_passkey_reply(user_input); /* 0..999999 */ + break; + + case BLE_UART_EVT_NUMERIC_COMPARE: + ESP_LOGI(TAG, "compare %06" PRIu32, e->numeric_compare.passkey); + /* Once the user confirms: */ + ble_uart_compare_reply(true /* or false on mismatch */); + break; + + default: break; + } +} +``` + +A `false` reply to `compare_reply()` makes pairing fail with a +numeric-comparison mismatch — surfaced as +`BLE_UART_EVT_PAIRING_FAILED`. To cancel `PASSKEY_REQUEST` without a +mismatch event, just don't call `passkey_reply()`; the SM will time +out the pairing. + +#### Backend differences + +- **Passkey Display without `on_event`**: both backends complete pairing; + only `PASSKEY_DISPLAY` is suppressed when the callback is `NULL`. The + UART banner (`show_passkey`) is always emitted for log-scraping tests. +- **Numeric Comparison edge case**: if `io_cap` resolved to DisplayOnly + but the central still negotiates NC (rare), Bluedroid rejects the + request when `on_event == NULL`; NimBLE may stall until the SM times + out — use `DISPLAY_YES_NO` / `KEYBOARD_DISPLAY` with a registered + `on_event` if you need NC. +- **NimBLE** lets the application observe the negotiated `key_size` + on `BLE_UART_EVT_LINK_SECURE`; **Bluedroid** surfaces a fixed `16` + (the value forced via `ESP_BLE_SM_MAX_KEY_SIZE` at install time — + Bluedroid does not expose the negotiated size on `AUTH_CMPL`). +- With `mitm=OFF`, NimBLE pairs with `_AUTHEN` permissions still + off on the chars; Bluedroid uses `ESP_GATT_PERM_*_ENCRYPTED` + (the encryption-without-MITM tier) to match. +- `cfg.encrypted=false` plus any `cfg.security.*=ON` override is + allowed — it partially enables the SM, e.g. + `cfg.encrypted=false, cfg.security.sc=ON` is "SC pairing without + MITM and without persisted bond". Useful only for lab interop + tests; production firmware should keep `cfg.encrypted = true` and + only override surgically. + +### 5.7 Bond management + +```c +/* All three are usable as soon as ble_uart_install() returns; they + * do not require ble_uart_open() to have been called yet — clearing + * stale bonds before the first advertising window is the canonical + * use case. */ +int ble_uart_get_bond_count(size_t *out_count); +int ble_uart_get_bonded_peers(ble_uart_addr_t *out, size_t cap, size_t *out_count); +int ble_uart_remove_peer(const ble_uart_addr_t *peer); +int ble_uart_clear_bonds(void); + +/* Address type used by remove_peer and BLE_UART_EVT_CONNECTED. */ +typedef struct { + uint8_t bytes[6]; /* big-endian: bytes[0] is the MSB octet */ + uint8_t type; /* BLE_UART_ADDR_TYPE_PUBLIC or _RANDOM */ +} ble_uart_addr_t; +``` + +| Function | Effect | +| --- | --- | +| `ble_uart_get_bond_count` | Number of peers in the persistent store; 0 means "no bonds yet". Pass `cap == 0` to `get_bonded_peers` for the same count without an address buffer. | +| `ble_uart_get_bonded_peers` | List bonded peer addresses; writes up to `cap`, reports total in `*out_count` (caller may re-call with a larger buffer if total > cap). `cap == 0` returns the count only. | +| `ble_uart_remove_peer` | Drop one peer's LTK / IRK / persisted CCCD. **Idempotent** — returns `BLE_UART_OK` even when the peer is not in the store (NimBLE: `ble_store_util_delete_peer` treats `BLE_HS_ENOENT` as success; Bluedroid: `esp_ble_remove_bond_device` does not fail on a missing entry). Call `get_bonded_peers()` first if you need to tell "removed" from "was never bonded". | +| `ble_uart_clear_bonds` | Drop *all* of the above; equivalent to a factory reset of the bond store, but does not touch any other NVS namespace | + +`ble_uart_remove_peer` and `ble_uart_clear_bonds` do **not** actively +disconnect the current link (encrypted or not). Call `ble_uart_close()` +first if you need an immediate disconnect and re-pair. + +**Where do I get the address?** From `BLE_UART_EVT_CONNECTED.connected.peer` +(see §5.2.1). Save it from your event handler the first time you see +each new peer, then pass it to `ble_uart_remove_peer` later when you +want to forget it. + +**Backend notes**: + +- Bluedroid matches bonds by BD address alone — `peer->type` is + ignored by `remove_peer`. If the peer first connected as + `address_A` and bonding succeeded, CONNECT and `get_bonded_peers()` + keep reporting `address_A` on later reconnects even when the + peer's over-the-air address has changed (e.g. a new RPA). +- NimBLE matches by `(type, identity-address)` — for an RPA peer this + is the resolved identity, **not** the random address you saw on the + wire. `BLE_UART_EVT_CONNECTED` reports the resolved identity when + it's known (post-pairing reconnect of a bonded RPA peer); on first + pair it equals the OTA random address, so the bond is recorded + under that random address and `remove_peer` works either way. +- Neither backend reports "peer not found" from `remove_peer` — a + wrong `(type, bytes)` pair that does not match any stored bond + still returns `BLE_UART_OK`. This mirrors the underlying stacks' + delete-if-present semantics, not a lookup-then-delete API. +- `ble_uart_clear_bonds` on Bluedroid iterates the bond list and + removes each entry; on NimBLE it calls `ble_store_clear()`, which + also wipes the local LTK and any persisted CCCD. +- **NimBLE** `get_bond_count` / `get_bonded_peers(cap=0)` heap-allocate a + scratch buffer sized to `BLE_STORE_MAX_BONDS` (not the caller's stack), + so they are safe from small-stack tasks regardless of + `CONFIG_BT_NIMBLE_MAX_BONDS`. + +### 5.8 Service UUID constant ```c extern const ble_uart_uuid128_t ble_uart_service_uuid; ``` Always `6e400001-b5a3-f393-e0a9-e50e24dcca9e` (the de-facto BLE UART service UUID). It is -already inserted into the scan response, so the **application normally -does not touch it**. You only need it if you take over advertising -yourself (see 6.3). +already inserted into the scan response **by the default payload**, so +the application only needs to reference it when it takes over the adv +bytes itself (see §5.9) or otherwise replaces our advertising (see §6.3). + +### 5.9 Custom advertising payloads + +`ble_uart` builds a sensible default for both the primary advertisement +and the scan response: + +| Packet | Default content | Why | +| --- | --- | --- | +| Primary adv (31 B max) | Flags AD + Complete Local Name (`device_name`) | Phones show the name; everything else in the 31 bytes is left for the application to add via `adv_data` | +| Scan response (31 B max) | Complete 128-bit BLE UART service UUID (18 B element) | The 128-bit UUID alone is too big to share the primary packet with a typical name | + +Set `adv_data` / `scan_rsp_data` in the config to override **everything +the application sees** — only the 3-byte Flags AD element of the primary +packet stays library-controlled (the BT spec mandates a Flags element, +and a few of its bits — General Discoverable / BR-EDR Not Supported — +are state we already negotiated with the controller). + +```c +/* +-- 31-byte primary advertisement packet ---------------------+ + * | [02 01 06] ← Flags AD prepended by ble_uart (3 bytes) | + * | | + * +-------------------------------------------------------------+ + * + * +-- 31-byte scan-response packet -----------------------------+ + * | | + * +-------------------------------------------------------------+ + */ +``` + +`adv_data_len` is checked at install time; oversized buffers fail with +`BLE_UART_EINVAL`. Both buffers are copied into module-private storage, +so the caller's pointers do not need to outlive the call. + +**Format**: a sequence of standard BT Core "AD structure" triplets — +`[length(1)] [AD type(1)] [value(length-1)]`. AD-type values are +defined in the *Bluetooth Assigned Numbers* document +([Generic Access Profile, §1](https://www.bluetooth.com/specifications/assigned-numbers/)). +Common ones: + +| Type | Name | Value format | +| --- | --- | --- | +| `0x09` | Complete Local Name | UTF-8 bytes | +| `0x08` | Shortened Local Name | UTF-8 bytes | +| `0x0A` | TX Power Level | 1 signed byte (dBm) | +| `0x07` | Complete List of 128-bit Service UUIDs | 16 bytes per UUID | +| `0xFF` | Manufacturer Specific Data | 2-byte company ID + payload | + +**Example — replace the default with name + UUID + 4 bytes of vendor data** + +```c +static const uint8_t adv_payload[] = { + /* Complete Local Name "MyDev" (1 + 1 + 5 = 7 bytes) */ + 0x06, 0x09, 'M', 'y', 'D', 'e', 'v', + + /* Complete 128-bit Service UUID — bytes are little-endian on air, + * matching ble_uart_service_uuid.bytes[]. (1 + 1 + 16 = 18 bytes) */ + 0x11, 0x07, + 0x9e, 0xca, 0xdc, 0x24, 0x0e, 0xe5, 0xa9, 0xe0, + 0x93, 0xf3, 0xa3, 0xb5, 0x01, 0x00, 0x40, 0x6e, + /* total = 7 + 18 = 25 bytes (≤ BLE_UART_ADV_DATA_MAX = 28) */ +}; + +static const uint8_t scan_rsp_payload[] = { + /* Manufacturer Specific Data: Espressif Systems (0x02E5) + 4 bytes */ + 0x07, 0xFF, 0xE5, 0x02, 0xDE, 0xAD, 0xBE, 0xEF, +}; + +ble_uart_install(&(ble_uart_config_t){ + .encrypted = true, + .device_name = "MyDev", /* GAP service value, peer-readable */ + .adv_data = adv_payload, + .adv_data_len = sizeof(adv_payload), + .scan_rsp_data = scan_rsp_payload, + .scan_rsp_data_len = sizeof(scan_rsp_payload), + .ble_uart_on_rx = on_rx, + .on_event = on_event, +}); +``` + +**Notes**: + +- `device_name` and `adv_data` are independent. The first is the GAP + service value that any connected peer can read over GATT; the second + is what scanners see before connecting. If you want the device name + visible during a scan, include a Complete-Local-Name AD element + (`0x09`) in `adv_data` yourself — providing custom `adv_data` + disables the auto-include path. +- The 31-byte packet limit is BLE 4.x legacy advertising. Extended + advertising (BLE 5.0) is **not** wired through this API — both + backends fall back to legacy advertising for portability. +- Set only one half if you want the other to keep its default — e.g. + custom `adv_data` with `scan_rsp_data = NULL` keeps the default + service-UUID scan response. --- @@ -467,8 +1164,12 @@ Effect: `ble_uart` registers its own service; you can call `ble_gatts_add_svcs()` **multiple times** and NimBLE will build all of them into the GATT -table. **Caveat**: this must happen before `ble_uart_open()`, otherwise -the host task is already running and the GATT table is locked. +table. **Caveat**: this must happen before the **first** `ble_uart_open()` +for that `install()` cycle, otherwise the host task is already running +and the GATT table is locked. If you use `ble_uart_close()` and later +`ble_uart_open()` without `uninstall()`, you must call your extra +`ble_svc_*_init()` / `ble_gatts_add_svcs()` again before that second +`open()` — see §5.3.1a. ```c ble_uart_install(&cfg); @@ -488,15 +1189,20 @@ ble_uart_open(); > call `ble_gap_adv_start` yourself. In that case, just fork > `ble_uart_nimble.c` (or the matching `ble_uart_bluedroid.c`). -### 6.4 Configuring the device-name prefix via Kconfig +### 6.4 Configuring the device name via Kconfig If you use the shared `ble_uart` component, options are already in `menuconfig → Component configuration → ESP-BLE-UART library`. If you copied only the `.c` / `.h` files into `main/`, copy `Kconfig` from `common/ble_uart/` as well (or merge its symbols into your own `Kconfig.projbuild`), then: +The bundled example builds a per-unit name as `-XXXX` where +`XXXX` is the last two BT MAC bytes in hex: + ```c -char name[24]; +uint8_t mac[6] = {0}; +esp_read_mac(mac, ESP_MAC_BT); +char name[BLE_UART_DEVICE_NAME_MAX + 1]; snprintf(name, sizeof(name), "%s-%02X%02X", CONFIG_BLE_UART_DEVICE_NAME_PREFIX, mac[4], mac[5]); @@ -507,8 +1213,11 @@ ble_uart_install(&(ble_uart_config_t){ }); ``` -Edit the default through `menuconfig → Component configuration → ESP-BLE-UART -library → BLE device name prefix`. +Edit the prefix through `menuconfig → Component configuration → +ESP-BLE-UART library → BLE device name prefix`. + +For a fixed name on every unit, skip the MAC suffix and pass any +string ≤ `BLE_UART_DEVICE_NAME_MAX` directly to `device_name`. ### 6.5 Pushing data proactively @@ -531,7 +1240,7 @@ static void sensor_task(void *arg) xTaskCreate(sensor_task, "sensor", 3072, NULL, 5, NULL); ``` -When nobody is subscribed, `ble_uart_tx` returns `BLE_HS_ENOTCONN` — +When nobody is subscribed, `ble_uart_tx` returns `BLE_UART_ENOTCONN` — **just ignore it**. --- @@ -543,10 +1252,11 @@ When nobody is subscribed, `ble_uart_tx` returns `BLE_HS_ENOTCONN` — | `ble_uart_install` | Any task; once per uninstall cycle | One-shot until `uninstall` | | `ble_uart_open` | Any task; after `install` | One-shot until `close` | | `ble_uart_close` | Any task **except the BLE host task** (NimBLE host task / Bluedroid BTC task) | Idempotent; second call returns `EALREADY` | -| `ble_uart_uninstall` | Any task **except the BLE host task** | Idempotent; cascades into `close` if needed | +| `ble_uart_close_async` | Any task — including the BLE host task (use this from inside `on_rx` / `on_event`) | Idempotent; second call while a worker is draining returns `EALREADY` | +| `ble_uart_uninstall` | Any task **except the BLE host task** | Idempotent; see §5.3 release paths; polls in-flight `close_async` ≤~5 s. Best-effort teardown: returns the **first** `BLE_UART_*` failure (`ble_uart_close` or translated `esp_err_t`) but always wipes module state so a retry is possible. | | `ble_uart_tx` | Any FreeRTOS task | Yes — multi-task concurrent | | `ble_uart_is_connected` / `is_subscribed` | Any context | Yes (bool read; best-effort snapshot) | -| `ble_uart_on_rx` callback | BLE host task (NimBLE host task / Bluedroid BTC task) | Your code must not block, **must not call `close` / `uninstall`** | +| `ble_uart_on_rx` / `on_event` callback | BLE host task (NimBLE host task / Bluedroid BTC task); **`BLE_UART_EVT_CLOSED` is the lone exception — fires on the close-async worker task** | Your code must not block, **must not call `close` / `uninstall`** — use `ble_uart_close_async()` instead | | **Calling any `ble_uart` API from an ISR** | not allowed | Neither host stack supports it | --- @@ -575,7 +1285,7 @@ Measured throughput (ESP32-S3, iPhone 14 Pro central, MTU 247): | --- | --- | | `nimble_port_init rc=...` | NVS not initialised, or BT controller not enabled | | Compile error: `host/ble_hs.h` not found | `REQUIRES bt` is missing from CMakeLists | -| Device not discoverable | Device name exceeds the advertising packet limit (drop the tx_pwr field or shorten the name) | +| `ble_uart_install()` returns `BLE_UART_EINVAL` | Buffer too long (`device_name` / `adv_data` / `scan_rsp` limits in §5.9), impossible security (`mitm=ON` + `io_cap=NO_INPUT_OUTPUT`), **`io_cap` in `{KEYBOARD_ONLY, DISPLAY_YES_NO, KEYBOARD_DISPLAY}` with `on_event=NULL`** (note: default `AUTO` + `encrypted=true` and explicit `DISPLAY_ONLY` **do** allow `on_event=NULL`), or out-of-range `sc`/`bonding`/`mitm`/`io_cap`. See §5.6. | | Pairing fails | Central uses "Just Works" but we require MITM (`encrypted=true`). Use a central that supports passkey entry | | `enc_change status=13 encrypted=1 bonded=1` | `13 = BLE_HS_ETIMEOUT`. Bonded-reconnect race; **the link is actually encrypted — safe to ignore** | | Notifications missing after a reconnect | Bonded centrals often skip the CCCD write; our TX path doesn't gate on subscription state, so notifications still go out — make sure the central side has its callback registered | @@ -613,19 +1323,42 @@ If you **start from an empty project**: #include "ble_uart.h" /* === Types === */ -typedef void (*ble_uart_rx_cb_t)(const uint8_t *data, size_t len); +typedef void (*ble_uart_rx_cb_t) (const uint8_t *data, size_t len); +typedef void (*ble_uart_evt_cb_t)(const ble_uart_evt_t *evt); typedef struct { - bool encrypted; - const char *device_name; - ble_uart_rx_cb_t ble_uart_on_rx; + ble_uart_sec_t sc; /* AUTO / OFF / ON — follow `encrypted` when AUTO */ + ble_uart_sec_t bonding; + ble_uart_sec_t mitm; + ble_uart_io_cap_t io_cap; /* AUTO / NO_INPUT_OUTPUT / DISPLAY_ONLY / + KEYBOARD_ONLY / DISPLAY_YES_NO / + KEYBOARD_DISPLAY */ +} ble_uart_security_t; + +typedef struct { + bool encrypted; /* preset: SC + Bonding + MITM + DisplayOnly */ + ble_uart_security_t security; /* per-feature overrides; see §5.6 */ + + const char *device_name; /* ≤ BLE_UART_DEVICE_NAME_MAX (26) */ + /* Custom adv payloads (NULL → defaults). + * Limits: adv_data_len ≤ BLE_UART_ADV_DATA_MAX (28), + * scan_rsp_data_len ≤ BLE_UART_SCAN_RSP_DATA_MAX (31). */ + const uint8_t *adv_data; + size_t adv_data_len; + const uint8_t *scan_rsp_data; + size_t scan_rsp_data_len; + ble_uart_rx_cb_t ble_uart_on_rx; + ble_uart_evt_cb_t on_event; /* optional for default Passkey Display; + required for KEYBOARD_ONLY / + DISPLAY_YES_NO / KEYBOARD_DISPLAY */ } ble_uart_config_t; /* === Lifecycle === */ int ble_uart_install(const ble_uart_config_t *cfg); /* host + GATT */ int ble_uart_open(void); /* start advertising (NimBLE: spawn host task) */ int ble_uart_close(void); /* stop adv / disconnect / quiesce host */ -int ble_uart_uninstall(void); /* tear down host + reset state */ +int ble_uart_close_async(void); /* same, fire-and-forget; signals BLE_UART_EVT_CLOSED on completion */ +int ble_uart_uninstall(void); /* best-effort teardown; first error, state always cleared */ /* === Send (callable from any task) === */ int ble_uart_tx(const uint8_t *data, size_t len); @@ -634,10 +1367,25 @@ int ble_uart_tx(const uint8_t *data, size_t len); /* Via the cfg.ble_uart_on_rx callback, signature: * void cb(const uint8_t *data, size_t len); */ +/* === Pairing replies (PASSKEY_REQUEST / NUMERIC_COMPARE only) === */ +int ble_uart_passkey_reply(uint32_t passkey); /* answer PASSKEY_REQUEST */ +int ble_uart_compare_reply(bool match); /* answer NUMERIC_COMPARE */ + /* === Status === */ bool ble_uart_is_connected(void); bool ble_uart_is_subscribed(void); +/* === Bond management (works after install) === */ +typedef struct { + uint8_t bytes[6]; /* big-endian: bytes[0] is MSB */ + uint8_t type; /* BLE_UART_ADDR_TYPE_PUBLIC or _RANDOM */ +} ble_uart_addr_t; + +int ble_uart_get_bond_count(size_t *out_count); +int ble_uart_get_bonded_peers(ble_uart_addr_t *out, size_t cap, size_t *out_count); +int ble_uart_remove_peer(const ble_uart_addr_t *peer); +int ble_uart_clear_bonds(void); + /* === Service UUID (for advertising; usually no need to touch) === */ extern const ble_uart_uuid128_t ble_uart_service_uuid; ``` diff --git a/examples/bluetooth/common/ble_uart/ble_uart.h b/examples/bluetooth/common/ble_uart/ble_uart.h index 584c0ac9eb3..ccf5cbd24cb 100644 --- a/examples/bluetooth/common/ble_uart/ble_uart.h +++ b/examples/bluetooth/common/ble_uart/ble_uart.h @@ -10,16 +10,24 @@ * backend is picked at compile time via CONFIG_BT_NIMBLE_ENABLED / * CONFIG_BT_BLUEDROID_ENABLED. * - * Lifecycle: + * Lifecycle — bring-up: * - * ble_uart_install(&cfg); // host + GATT service - * ble_uart_open(); // start advertising + auto-encrypt - * ... + * nvs_flash_init(); + * ble_uart_install(&cfg); // host + GATT service (once per uninstall) + * ble_uart_open(); // advertising + pairing + * + * Run-forever apps stop after open(). + * + * Lifecycle — release (pick one path; see PORTING.md §5.3): + * + * Path A — from a normal app task (not on_event / on_rx): * ble_uart_close(); // stop adv / disconnect / halt host * ble_uart_uninstall(); // free port + reset state * - * Run-forever apps only need install + open. close / uninstall is - * for apps that need to power BLE off at runtime. + * Path B — teardown triggered by a BLE event on the host task: + * ble_uart_close_async(); // in on_event / on_rx only + * // wait for BLE_UART_EVT_CLOSED (.closed.status == BLE_UART_OK) + * ble_uart_uninstall(); // on an app task — NOT inside CLOSED * * GATT layout (UUIDs are the widely used fixed 128-bit values): * @@ -57,6 +65,23 @@ typedef struct { uint8_t bytes[16]; } ble_uart_uuid128_t; +/* ----- BLE address ---------------------------------------------------- */ + +/** Address type, mirroring the BT Core spec values. */ +#define BLE_UART_ADDR_TYPE_PUBLIC 0 +#define BLE_UART_ADDR_TYPE_RANDOM 1 + +/** 6-octet BLE device address. + * + * `bytes` is in big-endian order — `bytes[0]` is the MSB octet, the + * way addresses are usually printed (`AA:BB:CC:DD:EE:FF`). Both + * backends marshal between this representation and their own native + * byte order internally, so callers never need to flip bytes. */ +typedef struct { + uint8_t bytes[6]; + uint8_t type; /* BLE_UART_ADDR_TYPE_PUBLIC or _RANDOM */ +} ble_uart_addr_t; + /* ----- Configuration -------------------------------------------------- */ /** RX byte callback. Invoked from the BLE host task whenever bytes @@ -71,27 +96,427 @@ typedef struct { * are rejected with ATT error 0x0d. */ typedef void (*ble_uart_rx_cb_t)(const uint8_t *data, size_t len); +/* ----- Event callback ------------------------------------------------- */ + +/** Lifecycle / link-state events delivered to ble_uart_config_t::on_event. + * + * All events fire from the BLE host task context (NimBLE host task / + * Bluedroid BTC task), with one documented exception: + * BLE_UART_EVT_CLOSED is fired by the close-async worker task, after + * the host stack has been torn down — there is no host task left to + * deliver it from. See ble_uart_close_async(). + * + * The same threading rules as ble_uart_on_rx apply: don't block, and + * don't call ble_uart_close() / ble_uart_uninstall() (use the async + * variant if you need to teardown from inside an event handler). */ +typedef enum { + /** Physical link established. Payload: .connected.peer. + * Type is always BLE_UART_ADDR_TYPE_PUBLIC or _RANDOM (each + * backend's wider addr-type enum is collapsed before delivery). + * + * Backend semantics differ: + * - NimBLE: peer identity address (`peer_id_addr`). On first + * connect this equals the over-the-air address; on a bonded + * RPA reconnect it is the resolved identity, not the random + * address currently on the wire. + * - Bluedroid: the BD address recorded at bond time. If the + * peer connected as address_A and bonding succeeded, later + * reconnects still report address_A in CONNECT even when the + * peer's over-the-air address has changed (e.g. a new RPA). + * Matches `get_bonded_peers()` / `remove_peer` (`bytes` only). */ + BLE_UART_EVT_CONNECTED, + + /** Physical link torn down. Payload: .disconnected.reason + * (stack-specific disconnect code — esp_gatt_conn_reason_t on + * Bluedroid, NimBLE BLE host return code on NimBLE; see + * BLE_HS_HCI_ERR() / BLE_HS_ERR_HCI_BASE for HCI encoding). */ + BLE_UART_EVT_DISCONNECTED, + + /** CCCD on the TX characteristic changed. Payload: + * .subscribed.subscribed (true = notifications enabled). */ + BLE_UART_EVT_SUBSCRIBED, + + /** Link reached the encrypted+authenticated state requested at + * install time. Payload: .link_secure.{encrypted, authenticated, + * bonded, key_size}. Use this — not is_connected() — to gate any + * application logic that requires the channel to be secure. */ + BLE_UART_EVT_LINK_SECURE, + + /** SM asks the application to display a 6-digit passkey. + * Payload: .passkey.passkey (0..999999). The default banner on + * UART still prints; this callback is additive so a UI / test + * harness can avoid scraping logs. */ + BLE_UART_EVT_PASSKEY_DISPLAY, + + /** SM asks the application to collect a 6-digit passkey from the + * user (the central displays it; the user types it into this + * device). No payload. + * + * The application MUST respond by calling ble_uart_passkey_reply() + * with the 6 digits the user entered. Until the reply arrives — + * or until the SM's pairing timeout fires (the controller's + * default ~30 s) — pairing is suspended; on timeout the link + * surfaces BLE_UART_EVT_PAIRING_FAILED. + * + * Only fires when cfg.security.io_cap is one of the input-capable + * values (KEYBOARD_ONLY / KEYBOARD_DISPLAY) and the central asks + * for Passkey Entry. */ + BLE_UART_EVT_PASSKEY_REQUEST, + + /** SM asks the application to display a 6-digit value and let the + * user confirm whether the same value appears on the central. + * Payload: .numeric_compare.passkey (0..999999). + * + * The application MUST respond by calling ble_uart_compare_reply() + * with the user's verdict (true = match). Same suspend-and-time- + * out semantics as BLE_UART_EVT_PASSKEY_REQUEST. + * + * Only fires when cfg.security.io_cap is one of the + * comparison-capable values (DISPLAY_YES_NO / KEYBOARD_DISPLAY) + * and the central asks for Numeric Comparison (which itself + * requires LE Secure Connections on both sides). */ + BLE_UART_EVT_NUMERIC_COMPARE, + + /** Pairing failed or was rejected. Payload: .pairing_failed.reason + * (NimBLE BLE_HS_E* / Bluedroid esp_ble_auth_fail_rsn_t). */ + BLE_UART_EVT_PAIRING_FAILED, + + /** Async-close completion — fired only by ble_uart_close_async() + * after the worker task has finished the equivalent of a + * synchronous ble_uart_close(). Payload: .closed.status — the + * return code from that close (BLE_UART_OK on success). + * + * When .closed.status is BLE_UART_OK the host stack is fully + * quiesced — same state as right after ble_uart_close() returns. + * Defer ble_uart_uninstall() to a normal app task (set a flag / + * queue here); do not call uninstall from this handler — see + * PORTING.md §5.3.2. On failure (e.g. BLE_UART_EFAIL) the port + * may still be open; retry ble_uart_close() / ble_uart_close_async() + * from an app task. + * + * Unlike every other event in this enum, this one runs on the + * close-async worker task, NOT on the BLE host task — by the + * time it fires the host task is already gone. Keep the handler + * short; the worker clears s_closing after it returns. */ + BLE_UART_EVT_CLOSED, +} ble_uart_evt_id_t; + +/** Tagged union delivered to ble_uart_config_t::on_event. */ +typedef struct { + ble_uart_evt_id_t id; + union { + struct { + ble_uart_addr_t peer; + } connected; + + struct { + int reason; /* stack-specific disconnect code */ + } disconnected; + + struct { + bool subscribed; + } subscribed; + + struct { + bool encrypted; /* 1 = link is AES-CCM encrypted */ + bool authenticated; /* 1 = pairing used MITM protection */ + bool bonded; /* 1 = LTK persisted in NVS */ + uint8_t key_size; /* 7..16 (octets) */ + } link_secure; + + struct { + uint32_t passkey; /* 0..999999 */ + } passkey; + + struct { + uint32_t passkey; /* 0..999999 — the value to display */ + } numeric_compare; + + struct { + int reason; /* stack-specific status code */ + } pairing_failed; + + struct { + int status; /* BLE_UART_* from async close worker */ + } closed; + }; +} ble_uart_evt_t; + +/** Event callback. May be NULL — events are silently dropped then. */ +typedef void (*ble_uart_evt_cb_t)(const ble_uart_evt_t *evt); + +/* ----- Security configuration ---------------------------------------- */ + +/** Tri-state knob for the per-feature security overrides in + * ble_uart_config_t (`sc`, `bonding`, `mitm`). + * + * AUTO (= 0, the value of a zero-initialised struct member) means + * "use whatever cfg.encrypted implies": + * + * encrypted = true → AUTO behaves as ON + * encrypted = false → AUTO behaves as OFF + * + * OFF / ON force the bit regardless of the preset, letting the + * caller mix the preset with one or two surgical overrides without + * spelling out every other field. */ +typedef enum { + BLE_UART_SEC_AUTO = 0, + BLE_UART_SEC_OFF = 1, + BLE_UART_SEC_ON = 2, +} ble_uart_sec_t; + +/** SM Input/Output capability — combines with the central's IO cap and + * the resolved `mitm` bit to pick the pairing model (Just Works / + * Passkey Display / Passkey Entry / Numeric Comparison — see BT Core + * Spec §2.3.5.1). The application doesn't decide the method directly; + * it picks the IO cap that matches its UI and ble_uart fires the right + * event when the SM negotiates a method. + * + * Passing an out-of-range integer makes ble_uart_install() return + * BLE_UART_EINVAL. Only the input-capable values (KEYBOARD_ONLY, + * DISPLAY_YES_NO, KEYBOARD_DISPLAY) require cfg.on_event to be + * non-NULL — pairing would otherwise stall on unanswered + * BLE_UART_EVT_PASSKEY_REQUEST / NUMERIC_COMPARE. AUTO (resolves to + * DisplayOnly when MITM is ON), DISPLAY_ONLY, and NO_INPUT_OUTPUT do + * not require on_event; Passkey Display is handled internally. */ +typedef enum { + /** Default: DisplayOnly when the resolved MITM bit is ON; + * NoInputNoOutput when it is OFF. */ + BLE_UART_IO_CAP_AUTO = 0, + + /** Device has no UI; pairing always uses Just Works. Cannot + * satisfy MITM — combining this with mitm=ON makes + * ble_uart_install() return BLE_UART_EINVAL. */ + BLE_UART_IO_CAP_NO_INPUT_OUTPUT = 1, + + /** Device shows a 6-digit passkey on a display; the central + * enters it. Generates a fresh passkey for every pairing, + * surfaced via BLE_UART_EVT_PASSKEY_DISPLAY (no reply call + * needed — the central does the typing). */ + BLE_UART_IO_CAP_DISPLAY_ONLY = 2, + + /** Device has keys (or some other way to feed digits to the + * library) but no display; the central displays a 6-digit + * passkey, the user reads it from there and types it in. + * + * ble_uart fires BLE_UART_EVT_PASSKEY_REQUEST and waits for + * ble_uart_passkey_reply(). Requires cfg.on_event != NULL. */ + BLE_UART_IO_CAP_KEYBOARD_ONLY = 3, + + /** Device has a display + a yes/no confirmation control. With a + * similarly-equipped LE Secure Connections central this elects + * Numeric Comparison: ble_uart fires BLE_UART_EVT_NUMERIC_COMPARE + * with the 6-digit value to display, and waits for + * ble_uart_compare_reply(). + * + * Falls back to Just Works against legacy or NoInput peers. + * Requires cfg.on_event != NULL. */ + BLE_UART_IO_CAP_DISPLAY_YES_NO = 4, + + /** Device has a display AND a keypad (covers both Numeric + * Comparison and Passkey Entry). Best fit for a touchscreen UI + * that wants to handle every MITM-capable peer. + * + * ble_uart fires either BLE_UART_EVT_PASSKEY_REQUEST or + * BLE_UART_EVT_NUMERIC_COMPARE depending on what the SM + * negotiates with the central; respond with the matching reply + * API. Requires cfg.on_event != NULL. */ + BLE_UART_IO_CAP_KEYBOARD_DISPLAY = 5, +} ble_uart_io_cap_t; + +/** Per-feature security overrides, embedded in ble_uart_config_t. + * + * Each tri-state field defaults to AUTO (= 0, the value of any + * zero-initialised member), inheriting its bit from + * ble_uart_config_t::encrypted: + * + * encrypted = true → AUTO behaves as ON + * encrypted = false → AUTO behaves as OFF + * + * Set any field to OFF / ON to override that single bit while the + * rest still follow the preset. Common patterns are listed in + * PORTING.md §5.6 (e.g. encrypted=true with mitm=OFF + + * io_cap=NO_INPUT_OUTPUT for a displayless gateway). + * + * Combinations the SM cannot satisfy — io_cap=NO_INPUT_OUTPUT + * together with the resolved mitm=ON, or an out-of-range enum value + * — make ble_uart_install() return BLE_UART_EINVAL up front, before + * the host stack is brought up. */ +typedef struct { + /** Override LE Secure Connections (the BT 4.2+ pairing method + * that uses ECDH for the LTK). */ + ble_uart_sec_t sc; + + /** Override bonding (persistence of the LTK / IRK / persisted + * CCCD in NVS). With bonding=OFF the link is still encrypted + * (if sc/mitm are on) but every reconnect re-pairs. */ + ble_uart_sec_t bonding; + + /** Override MITM protection (man-in-the-middle: link + * authentication via passkey display / entry / numeric + * comparison). With mitm=OFF the link pairs via Just Works, + * which is encrypted but unauthenticated; the GATT permission + * flags drop their _AUTHEN bit so a Just-Works peer can + * read/write the UART characteristics. */ + ble_uart_sec_t mitm; + + /** SM IO capability — controls which pairing model is chosen + * alongside `mitm`. AUTO picks DisplayOnly when the resolved + * MITM bit is ON, NoInputNoOutput when it is OFF. */ + ble_uart_io_cap_t io_cap; +} ble_uart_security_t; + +/* ----- Advertising payload limits ------------------------------------ */ + +/** Maximum bytes the application may put in `adv_data`. + * + * BLE 4.x legacy primary advertising packets are capped at 31 bytes + * total. Of those, the 3-byte Flags AD element (length+type+value) + * is always added by ble_uart, leaving 31 − 3 = 28 bytes for the + * application. */ +#define BLE_UART_ADV_DATA_MAX 28 + +/** Maximum bytes the application may put in `scan_rsp_data`. + * + * Scan response packets are also capped at 31 bytes, with no + * mandatory AD elements — the entire 31 bytes belong to the + * application. */ +#define BLE_UART_SCAN_RSP_DATA_MAX 31 + +/** Maximum length (bytes, excluding NUL terminator) of `device_name`. + * + * Sized so that the *default* advertising payload — Flags AD + + * Complete Local Name AD — always fits in the 31-byte primary packet: + * + * 31 − 3 (Flags AD) − 2 (Name AD header) = 26 + * + * Names that exceed this length make `ble_uart_install()` return + * `BLE_UART_EINVAL` synchronously, instead of silently failing later + * in the host stack when advertising starts. + * + * This applies regardless of whether `adv_data` is set — the GAP + * service Device Name characteristic (UUID 0x2A00) reports the same + * string. Apps that need a longer GAP-service name with a shorter + * advertised name should keep `device_name` ≤ this limit and use + * `adv_data` to broadcast a shortened/different name instead. */ +#define BLE_UART_DEVICE_NAME_MAX 26 + /** Configuration handed to ble_uart_install(). */ typedef struct { - /** True = LE Secure Connections + Bonding + MITM, DisplayOnly IO, - * encrypted RX/TX chars, bond persisted in NVS (NimBLE: requires - * CONFIG_BT_NIMBLE_NVS_PERSIST=y; Bluedroid: default). - * False = plaintext (lab debugging only — sniffable). */ + /** Security preset (a one-line shortcut for the four override + * fields under `security` below). + * + * True = LE Secure Connections + Bonding + MITM, DisplayOnly IO, + * encrypted+authenticated RX/TX chars, bond persisted in + * NVS (NimBLE: requires CONFIG_BT_NIMBLE_NVS_PERSIST=y; + * Bluedroid: default). + * False = plaintext (lab debugging only — sniffable). + * + * Every member of `security` defaults to AUTO, meaning "follow + * this preset". Override individual bits there; see + * ble_uart_security_t for the resolution rules. */ bool encrypted; - /** GAP device name. NULL keeps the host stack default. Mind the - * 31-byte primary advertising limit (≤ 8 bytes recommended). */ + /** Per-feature security overrides. A zero-initialised value + * (every field AUTO) inherits everything from `encrypted`, so + * callers that just want the secure-by-default preset can leave + * this field unset: + * + * ble_uart_install(&(ble_uart_config_t){ + * .encrypted = true, // sc/bonding/mitm/io_cap all AUTO + * ... + * }); + * + * Surgical override: + * + * ble_uart_install(&(ble_uart_config_t){ + * .encrypted = true, + * .security = { .mitm = BLE_UART_SEC_OFF }, // SC + Bonding, no MITM + * ... + * }); + * + * See ble_uart_security_t for the full per-field docs. */ + ble_uart_security_t security; + + /** GAP device name (peer-readable via the GAP service, UUID 0x2A00). + * NULL keeps the host-stack default. + * + * Length must be ≤ BLE_UART_DEVICE_NAME_MAX (26) — over-long + * strings make ble_uart_install() return BLE_UART_EINVAL. + * + * This is NOT automatically inserted into the advertising payload + * when `adv_data` (below) is non-NULL — if you want the name to + * appear in scans without connecting, include a Complete Local + * Name AD element (type 0x09) in your `adv_data` bytes yourself. */ const char *device_name; + /** Optional raw advertising data — everything that goes after the + * 3-byte Flags AD element in the primary advertising packet. The + * Flags element is built by ble_uart and is NOT part of these + * bytes (don't include it). + * + * Format: standard BT Core "AD structure" sequence — repeating + * `[length(1)][AD type(1)][value(length-1)]` triplets. See the + * Bluetooth Assigned Numbers (Generic Access Profile) document + * for the full type list. + * + * Length must be ≤ BLE_UART_ADV_DATA_MAX (28). The buffer is + * copied at install time; the pointer does not need to outlive + * the call. + * + * Set to NULL (with adv_data_len=0) to keep the built-in default, + * which advertises only the Complete Local Name (taken from + * device_name). */ + const uint8_t *adv_data; + size_t adv_data_len; + + /** Optional raw scan response data — entire 31-byte payload is at + * the application's disposal; ble_uart adds nothing. + * + * Same `[len][type][value]` format and copy semantics as + * adv_data. Length must be ≤ BLE_UART_SCAN_RSP_DATA_MAX (31). + * + * Set to NULL (with scan_rsp_data_len=0) to keep the built-in + * default, which advertises the 128-bit BLE UART service UUID. */ + const uint8_t *scan_rsp_data; + size_t scan_rsp_data_len; + /** Byte handler for RX writes. NULL discards incoming data. */ ble_uart_rx_cb_t ble_uart_on_rx; + + /** Lifecycle / link-state event sink. NULL drops every event. + * See ble_uart_evt_id_t for the supported events; runs on the + * BLE host task with the same caveats as ble_uart_on_rx. */ + ble_uart_evt_cb_t on_event; } ble_uart_config_t; /* ----- Lifecycle ------------------------------------------------------ */ /** Bring up host stack + Security Manager + SIG services + BLE UART GATT * service. Caller must have already called nvs_flash_init(). - * cfg->device_name is copied; doesn't need to outlive the call. + * + * cfg->device_name, cfg->adv_data and cfg->scan_rsp_data are all + * copied internally; the caller's buffers don't need to outlive the + * call. Returns BLE_UART_EINVAL if any of these checks fail: + * strlen(cfg->device_name) > BLE_UART_DEVICE_NAME_MAX (26) + * cfg->adv_data_len > BLE_UART_ADV_DATA_MAX (28) + * cfg->scan_rsp_data_len > BLE_UART_SCAN_RSP_DATA_MAX (31) + * cfg->security.{sc,bonding,mitm} outside BLE_UART_SEC_{AUTO,OFF,ON} + * cfg->security.io_cap outside BLE_UART_IO_CAP_{AUTO, + * NO_INPUT_OUTPUT,DISPLAY_ONLY, + * KEYBOARD_ONLY,DISPLAY_YES_NO, + * KEYBOARD_DISPLAY} + * resolved mitm=ON + io_cap=NO_INPUT_OUTPUT + * (Just Works can never satisfy MITM) + * io_cap requires user input (KEYBOARD_ONLY, DISPLAY_YES_NO, + * KEYBOARD_DISPLAY) but cfg->on_event + * is NULL — the application would have + * no way to receive PASSKEY_REQUEST / + * NUMERIC_COMPARE and answer it + * (io_cap=AUTO with resolved mitm=ON, or DISPLAY_ONLY, does not + * need on_event — equivalent to Passkey Display handled inside + * the port; PASSKEY_DISPLAY via on_event is optional) + * * Single-shot until ble_uart_uninstall(); a second call returns * BLE_UART_EALREADY. */ int ble_uart_install(const ble_uart_config_t *cfg); @@ -111,16 +536,84 @@ int ble_uart_open(void); * quiesces the host. install state is preserved — call open() again * to resume. * - * Don't call from the BLE host task (i.e. from ble_uart_on_rx). */ + * NimBLE: also resets the local GATT server; the next open() re-adds + * GAP/GATT/UART. Service UUIDs are unchanged but ATT handles may + * differ — centrals must rediscover and re-subscribe (PORTING.md + * §5.3.1a). Bluedroid: host and GATT table stay up; open() only + * restarts advertising. + * + * Don't call from the BLE host task (i.e. from ble_uart_on_rx or + * ble_uart_evt_cb_t) — it would deadlock waiting for the disconnect + * event that the host task itself is supposed to deliver. Use + * ble_uart_close_async() in those contexts instead. */ int ble_uart_close(void); +/** Fire-and-forget variant of ble_uart_close(). Returns immediately + * after spawning a small worker task that runs the regular close + * sequence in the background; safe from ANY task — including the + * BLE host task (i.e. from inside ble_uart_on_rx or on_event), where + * the synchronous variant deadlocks. + * + * Completion is reported on the on_event callback as + * BLE_UART_EVT_CLOSED with .closed.status set to the worker's + * ble_uart_close() result. When status is BLE_UART_OK the host stack + * is fully torn down — then uninstall on an app task after + * BLE_UART_EVT_CLOSED (PORTING.md §5.3.2 Path B). + * (BLE_UART_EVT_DISCONNECTED is also delivered, ahead of CLOSED, if + * there was a peer.) + * + * Idempotent in the harmless sense: calling it before + * ble_uart_open() has succeeded, or while a previous async close + * is still draining, returns BLE_UART_EALREADY without spawning a + * second worker. Returns BLE_UART_ENOMEM if FreeRTOS can't + * allocate the worker task. */ +int ble_uart_close_async(void); + /** Counterpart to ble_uart_install(). Force-closes if still open, * then tears down the host stack + controller. After this returns, * install() can run from scratch. * - * Don't call from the BLE host task. */ + * Don't call from the BLE host task (NimBLE host / Bluedroid BTC). + * If a ble_uart_close_async() worker is still running, this call + * polls for up to ~5 s and then proceeds with teardown anyway if the + * worker has not exited — do not call uninstall from another task + * while a close_async is in flight unless you follow PORTING.md §5.3: + * Path A — ble_uart_close() then uninstall from an app task; or + * Path B — close_async, then uninstall on an app task after + * BLE_UART_EVT_CLOSED with .closed.status == BLE_UART_OK (never + * call uninstall from inside the CLOSED handler). */ int ble_uart_uninstall(void); +/* ----- Pairing replies ----------------------------------------------- */ + +/** Answer an in-flight BLE_UART_EVT_PASSKEY_REQUEST. + * + * `passkey` is the 6-digit value the user read off the central's + * display and entered on this device — must be in 0..999999. + * + * Safe from any task. Returns: + * BLE_UART_OK reply was injected into the SM + * BLE_UART_EINVAL passkey > 999999 + * BLE_UART_ENOTCONN no PASSKEY_REQUEST is currently pending + * (link dropped, pairing already timed out, + * or the SM asked for something else) + * BLE_UART_EFAIL backend rejected the inject + * + * Each PASSKEY_REQUEST event accepts exactly one reply; subsequent + * calls return BLE_UART_ENOTCONN until the next request. */ +int ble_uart_passkey_reply(uint32_t passkey); + +/** Answer an in-flight BLE_UART_EVT_NUMERIC_COMPARE. + * + * `match` is the user's verdict: true if the 6-digit values shown + * on this device and on the central are identical, false otherwise. + * A `false` reply makes pairing fail with a numeric-comparison + * mismatch, surfaced as BLE_UART_EVT_PAIRING_FAILED. + * + * Same threading semantics and return codes as + * ble_uart_passkey_reply(). */ +int ble_uart_compare_reply(bool match); + /* ----- TX ------------------------------------------------------------- */ /** Send raw bytes to the connected central as one or more TX @@ -143,6 +636,68 @@ bool ble_uart_is_connected(void); * the CCCD write); exposed for diagnostics only. */ bool ble_uart_is_subscribed(void); +/* ----- Bond management ----------------------------------------------- */ + +/** Number of bonded peers in the persistent store. + * + * Requires ble_uart_install() to have run; works whether or not + * ble_uart_open() has been called. *out_count is left untouched on + * failure. Safe from any task. */ +int ble_uart_get_bond_count(size_t *out_count); + +/** List the bonded peers' addresses. + * + * Up to `cap` entries are written to `out`; on success *out_count + * receives the **total** number of bonds (which may exceed `cap`). + * When *out_count > cap the caller may allocate a larger buffer + * and re-call to read the rest. + * + * `out` may be NULL if `cap` is 0 — useful as a preflight to size + * an exactly-fitting buffer (although ble_uart_get_bond_count() + * does the same with one less argument). + * + * Safe from any task. Requires ble_uart_install() to have run. */ +int ble_uart_get_bonded_peers(ble_uart_addr_t *out, + size_t cap, + size_t *out_count); + +/** Drop the bond (LTK / IRK / persisted CCCD) for one peer. + * + * Does not actively disconnect the current link (encrypted or not). + * Call ble_uart_close() first if you need an immediate disconnect + * and re-pair. + * + * `peer` is matched against the identity address in the bond store. + * Backend matching: + * - NimBLE: `(type, bytes)`. `BLE_UART_EVT_CONNECTED` and + * `get_bonded_peers()` both yield identity addresses suitable + * for this call (first connect: same as over-the-air; bonded RPA + * reconnect: resolved identity, not the random on the wire). + * - Bluedroid: `bytes` only — `type` is ignored. The bond store + * and CONNECT both use the address seen when bonding was + * established (address_A); later over-the-air changes are not + * reflected in either API. + * + * Idempotent: returns BLE_UART_OK whether or not the peer was bonded + * (both backends treat "already absent" as success — NimBLE's + * ble_store_util_delete_peer maps BLE_HS_ENOENT to 0). Use + * ble_uart_get_bonded_peers() first if you need to distinguish + * "removed" from "was never bonded". + * + * Returns BLE_UART_EINVAL if peer is NULL or ble_uart_install() has + * not run. Safe from any task. */ +int ble_uart_remove_peer(const ble_uart_addr_t *peer); + +/** Drop ALL bonded peers — equivalent to a factory reset of the bond + * store, but does not touch any other NVS namespace. + * + * Does not actively disconnect the current link (encrypted or not). + * Call ble_uart_close() first if you need an immediate disconnect + * and re-pair. + * + * Returns BLE_UART_OK if the store was cleared. Safe from any task. */ +int ble_uart_clear_bonds(void); + /* ----- Service UUID -------------------------------------------------- */ /** The BLE UART service UUID, exposed for custom advertising payloads. diff --git a/examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c b/examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c index 8e09ac6cc4d..7bd3474ee08 100644 --- a/examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c +++ b/examples/bluetooth/common/ble_uart/ble_uart_bluedroid.c @@ -21,6 +21,7 @@ #include "ble_uart.h" #include +#include #include #include "freertos/FreeRTOS.h" @@ -109,9 +110,42 @@ static bool s_subscribed; static bool s_installed; static bool s_opened; static bool s_shutting_down; +/* Set by ble_uart_close_async() when its worker task is in flight, + * cleared by the worker just before it exits. uninstall() polls this + * to drain a pending async close before tearing the stack down. */ +static volatile bool s_closing; static volatile bool s_attr_tab_ready; static bool s_adv_active; +/* Resolved security policy. Computed once in install() from cfg.encrypted + * + the per-feature overrides (cfg.sc/bonding/mitm/io_cap), then read + * by the GAP event handler and the GATT-table builder. + * s_link_encrypted = true if any of {sc, bonding, mitm} resolved ON + * → kick pairing on connect, require encryption on chars + * s_mitm_required = resolved mitm bit + * → require ENC_MITM perm flags (Just-Works peer cannot read/write) */ +static bool s_link_encrypted; +static bool s_mitm_required; + +/* Pending Passkey-Entry / Numeric-Comparison request awaiting an + * application reply via ble_uart_passkey_reply / ble_uart_compare_reply. + * + * Bluedroid identifies the pairing peer by BD address (no conn-handle + * exposed at the SM layer), so we cache it in s_pending_io_bda. The + * `kind` field discriminates the two flavors so the wrong reply API + * is rejected up front. NONE = no request in flight. + * + * No FreeRTOS lock — both fields are written only from the BTC task, + * and the reply API is the only outside reader. The reader takes a + * local snapshot before issuing the SDK reply call. */ +typedef enum { + PENDING_IO_NONE = 0, + PENDING_IO_PASSKEY, /* expects ble_uart_passkey_reply */ + PENDING_IO_NUMCMP, /* expects ble_uart_compare_reply */ +} pending_io_kind_t; +static volatile pending_io_kind_t s_pending_io_kind; +static esp_bd_addr_t s_pending_io_bda; + /* Two-bit latch driving the "configure adv data + scan rsp before * start_advertising" sequence. start_advertising fires only when both * SET_COMPLETE_EVT events have cleared their bit. */ @@ -119,11 +153,26 @@ static bool s_adv_active; #define SCAN_RSP_CONFIG_FLAG (1 << 1) static uint8_t s_adv_config_done; +/* Optional user-supplied advertising payloads. When *_len is non-zero + * we feed *_data straight to the Bluedroid raw configuration API + * (esp_ble_gap_config_adv_data_raw / config_scan_rsp_data_raw); the + * adv buffer carries the 3-byte Flags AD element we built in install() + * followed by the user's bytes. Zero length means "use the default + * struct-based path in configure_advertising()". */ +static uint8_t s_adv_data_buf[3 + BLE_UART_ADV_DATA_MAX]; +static uint8_t s_adv_data_len; +static uint8_t s_scan_rsp_buf[BLE_UART_SCAN_RSP_DATA_MAX]; +static uint8_t s_scan_rsp_len; + /* Long-write accumulator (Bluedroid doesn't reassemble for us). */ static uint8_t s_rx_buf[RX_SCRATCH]; static uint16_t s_prep_len; static bool s_prep_bad; +/* Forward declaration so handle_write() / GATT-event handler / GAP-event + * handler can fire events before emit_evt's body lower in this file. */ +static void emit_evt(const ble_uart_evt_t *evt); + /* ===== Backend rc → public rc ========================================= */ static int xlate_rc(esp_err_t rc) @@ -139,17 +188,26 @@ static int xlate_rc(esp_err_t rc) /* ===== GATT attribute table =========================================== */ -/* Permissions are patched at install time depending on cfg.encrypted. */ +/* Permissions are patched at install time depending on the resolved + * security policy. Three permission tiers: + * !link_enc → plain READ / WRITE (any peer) + * link_enc && !mitm → ENCRYPTED (Just-Works peer OK; auth bit not required) + * link_enc && mitm → ENC_MITM (only authenticated peers) */ static esp_gatts_attr_db_t s_nus_db[NUS_IDX_NB]; -static void build_attr_table(bool encrypted) +static void build_attr_table(bool link_enc, bool mitm) { - const esp_gatt_perm_t r_perm = encrypted - ? (ESP_GATT_PERM_READ_ENC_MITM) - : (ESP_GATT_PERM_READ); - const esp_gatt_perm_t w_perm = encrypted - ? (ESP_GATT_PERM_WRITE_ENC_MITM) - : (ESP_GATT_PERM_WRITE); + esp_gatt_perm_t r_perm, w_perm; + if (!link_enc) { + r_perm = ESP_GATT_PERM_READ; + w_perm = ESP_GATT_PERM_WRITE; + } else if (mitm) { + r_perm = ESP_GATT_PERM_READ_ENC_MITM; + w_perm = ESP_GATT_PERM_WRITE_ENC_MITM; + } else { + r_perm = ESP_GATT_PERM_READ_ENCRYPTED; + w_perm = ESP_GATT_PERM_WRITE_ENCRYPTED; + } /* [SVC] primary service declaration */ s_nus_db[NUS_IDX_SVC] = (esp_gatts_attr_db_t){ @@ -238,7 +296,7 @@ static void build_attr_table(bool encrypted) static esp_ble_adv_data_t s_adv_data = { .set_scan_rsp = false, .include_name = true, - .include_txpower = true, + .include_txpower = false, .min_interval = 0, .max_interval = 0, .appearance = 0x00, @@ -251,8 +309,9 @@ static esp_ble_adv_data_t s_adv_data = { .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), }; -/* Scan response = 128-bit UART service UUID. Splitting it off the primary payload - * leaves room for name + tx_pwr in the 31-byte primary. */ +/* Scan response = 128-bit UART service UUID. Splitting it off the primary + * payload leaves room for the Complete Local Name in the 31-byte primary + * (an 18-byte UUID element + a 9-byte name AD wouldn't fit alongside Flags). */ static esp_ble_adv_data_t s_scan_rsp_data = { .set_scan_rsp = true, .include_name = false, @@ -284,6 +343,11 @@ static int start_advertising(void) /* Push adv data + scan response. start_advertising is triggered from * the matching SET_COMPLETE_EVT once both halves are realised. * + * Each half independently picks struct-API (default payload) or raw-API + * (when the app supplied bytes via cfg). The two SET_COMPLETE event + * variants (regular vs. _RAW_) clear the same latch bit, so the GAP + * handler doesn't need to know which path we took. + * * On a sync failure of either config call, the matching SET_COMPLETE_EVT * will NEVER fire — so we must wipe the latch entirely (not just clear * one bit) to avoid (a) advertising silently lost, or (b) the other @@ -292,13 +356,23 @@ static int configure_advertising(void) { s_adv_config_done = ADV_CONFIG_FLAG | SCAN_RSP_CONFIG_FLAG; - esp_err_t rc = esp_ble_gap_config_adv_data(&s_adv_data); + esp_err_t rc; + if (s_adv_data_len > 0) { + rc = esp_ble_gap_config_adv_data_raw(s_adv_data_buf, s_adv_data_len); + } else { + rc = esp_ble_gap_config_adv_data(&s_adv_data); + } if (rc != ESP_OK) { ESP_LOGE(TAG, "config_adv_data rc=%s", esp_err_to_name(rc)); s_adv_config_done = 0; return xlate_rc(rc); } - rc = esp_ble_gap_config_adv_data(&s_scan_rsp_data); + + if (s_scan_rsp_len > 0) { + rc = esp_ble_gap_config_scan_rsp_data_raw(s_scan_rsp_buf, s_scan_rsp_len); + } else { + rc = esp_ble_gap_config_adv_data(&s_scan_rsp_data); + } if (rc != ESP_OK) { ESP_LOGE(TAG, "config_scan_rsp rc=%s", esp_err_to_name(rc)); /* adv_data is in flight; its SET_COMPLETE_EVT will hit the @@ -420,8 +494,17 @@ static void handle_write(esp_ble_gatts_cb_param_t *p) } else { uint16_t cccd = (uint16_t)p->write.value[0] | ((uint16_t)p->write.value[1] << 8); - s_subscribed = (cccd & 0x0001) != 0; - ESP_LOGI(TAG, "subscribe cccd=0x%04x sub=%d", cccd, s_subscribed); + bool sub = (cccd & 0x0001) != 0; + ESP_LOGI(TAG, "subscribe cccd=0x%04x sub=%d", cccd, sub); + /* Edge-trigger: a redundant CCCD write (same value twice) + * shouldn't double-fire SUBSCRIBED. */ + if (sub != s_subscribed) { + s_subscribed = sub; + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_SUBSCRIBED, + .subscribed = { .subscribed = sub }, + }); + } } } @@ -508,7 +591,7 @@ static void gatts_profile_event_handler(esp_gatts_cb_event_t event, ESP_LOGI(TAG, "mtu=%u (conn=%u)", s_local_mtu, param->mtu.conn_id); break; - case ESP_GATTS_CONNECT_EVT: + case ESP_GATTS_CONNECT_EVT: { /* Bluedroid only fires this on a successful physical link; * the param struct has no status field. */ s_conn_id = param->connect.conn_id; @@ -521,24 +604,61 @@ static void gatts_profile_event_handler(esp_gatts_cb_event_t event, memcpy(s_remote_bda, param->connect.remote_bda, sizeof(s_remote_bda)); ESP_LOGI(TAG, "connect conn_id=%u remote " ESP_BD_ADDR_STR, s_conn_id, ESP_BD_ADDR_HEX(s_remote_bda)); - if (s_cfg.encrypted) { + /* esp_bd_addr_t is already MSB-first, matches our public + * bytes[] convention — no byte reversal needed. Narrow the + * 4-value Bluedroid addr type into our public 2-value enum + * (RPA_* collapse onto their underlying public/random type). */ + ble_uart_evt_t e = { .id = BLE_UART_EVT_CONNECTED }; + memcpy(e.connected.peer.bytes, param->connect.remote_bda, 6); + e.connected.peer.type = + (param->connect.ble_addr_type == BLE_ADDR_TYPE_PUBLIC + || param->connect.ble_addr_type == BLE_ADDR_TYPE_RPA_PUBLIC) + ? BLE_UART_ADDR_TYPE_PUBLIC + : BLE_UART_ADDR_TYPE_RANDOM; + emit_evt(&e); + if (s_link_encrypted) { /* Kick pairing immediately rather than lazily on the - * first encrypted attribute access. */ - esp_ble_set_encryption(param->connect.remote_bda, - ESP_BLE_SEC_ENCRYPT_MITM); + * first encrypted attribute access. The security level + * tracks the resolved MITM bit so a mitm=OFF peer is + * allowed to pair via Just Works. */ + esp_ble_sec_act_t sec_act = s_mitm_required + ? ESP_BLE_SEC_ENCRYPT_MITM + : ESP_BLE_SEC_ENCRYPT_NO_MITM; + esp_ble_set_encryption(param->connect.remote_bda, sec_act); } break; + } case ESP_GATTS_DISCONNECT_EVT: ESP_LOGI(TAG, "disconnect conn_id=%u reason=0x%x", param->disconnect.conn_id, param->disconnect.reason); + /* Drop any pending Passkey-Entry / NC reply; pairing was + * cancelled along with the link. */ + s_pending_io_kind = PENDING_IO_NONE; + /* Match NimBLE's BLE_GAP_SUBSCRIBE_REASON_TERM behaviour: if + * the central was subscribed when the link dropped, synthesize + * an "implicit unsubscribe" event before DISCONNECTED so a + * strict state-machine consumer can rely on a single rule + * ("SUBSCRIBED tracks notification flow") regardless of host + * stack. NimBLE does this in ble_gatts.c on TERM; Bluedroid + * doesn't, so we do it here. */ + if (s_subscribed) { + s_subscribed = false; + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_SUBSCRIBED, + .subscribed = { .subscribed = false }, + }); + } s_conn_id = 0xFFFF; - s_subscribed = false; /* MTU is per-connection: reset to the spec default 23 so the * next peer (if it skips the MTU exchange) doesn't inherit * the previous link's negotiated value and overflow tx chunks. */ s_local_mtu = 23; prep_reset(); + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_DISCONNECTED, + .disconnected = { .reason = (int)param->disconnect.reason }, + }); if (!s_shutting_down) { start_advertising(); } @@ -576,15 +696,23 @@ static void gap_event_handler(esp_gap_ble_cb_event_t event, * 1) drop stale events (latch already zeroed by a sync failure); * 2) drop async failures (status != SUCCESS) and wipe the latch * so the other half can't satisfy the "==0 → start_adv" check - * and launch advertising with a malformed payload. */ + * and launch advertising with a malformed payload. + * + * Each side handles two event variants — the regular SET_COMPLETE + * (struct API) and the _RAW_ variant (raw-bytes API). They both + * clear the same latch bit; only the parameter struct differs. */ case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT: + case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT: { if (!(s_adv_config_done & ADV_CONFIG_FLAG)) { ESP_LOGD(TAG, "stale ADV_DATA_SET_COMPLETE_EVT ignored"); break; } - if (param->adv_data_cmpl.status != ESP_BT_STATUS_SUCCESS) { - ESP_LOGE(TAG, "adv_data set failed status=0x%x", - param->adv_data_cmpl.status); + esp_bt_status_t st = + (event == ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT) + ? param->adv_data_cmpl.status + : param->adv_data_raw_cmpl.status; + if (st != ESP_BT_STATUS_SUCCESS) { + ESP_LOGE(TAG, "adv_data set failed status=0x%x", st); s_adv_config_done = 0; break; } @@ -593,15 +721,20 @@ static void gap_event_handler(esp_gap_ble_cb_event_t event, start_advertising(); } break; + } case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT: + case ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT: { if (!(s_adv_config_done & SCAN_RSP_CONFIG_FLAG)) { ESP_LOGD(TAG, "stale SCAN_RSP_DATA_SET_COMPLETE_EVT ignored"); break; } - if (param->scan_rsp_data_cmpl.status != ESP_BT_STATUS_SUCCESS) { - ESP_LOGE(TAG, "scan_rsp set failed status=0x%x", - param->scan_rsp_data_cmpl.status); + esp_bt_status_t st = + (event == ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT) + ? param->scan_rsp_data_cmpl.status + : param->scan_rsp_data_raw_cmpl.status; + if (st != ESP_BT_STATUS_SUCCESS) { + ESP_LOGE(TAG, "scan_rsp set failed status=0x%x", st); s_adv_config_done = 0; break; } @@ -610,6 +743,7 @@ static void gap_event_handler(esp_gap_ble_cb_event_t event, start_advertising(); } break; + } case ESP_GAP_BLE_ADV_START_COMPLETE_EVT: if (param->adv_start_cmpl.status != ESP_BT_STATUS_SUCCESS) { @@ -618,7 +752,20 @@ static void gap_event_handler(esp_gap_ble_cb_event_t event, s_adv_active = false; break; } - ESP_LOGI(TAG, "advertising started"); + /* With a caller-supplied adv_data the broadcast name is whatever + * bytes the caller put in — not necessarily the GAP-service + * Device Name. Log each path differently so a misconfigured + * payload is easy to spot. (The GAP name itself isn't echoed + * here on this backend: Bluedroid swallows the pointer in + * REG_EVT and there's no sync getter.) */ + if (s_adv_data_len > 0 || s_scan_rsp_len > 0) { + ESP_LOGI(TAG, "advertising with custom payload " + "(adv=%u B, scan_rsp=%u B)", + (unsigned)s_adv_data_len, + (unsigned)s_scan_rsp_len); + } else { + ESP_LOGI(TAG, "advertising started"); + } break; case ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT: @@ -626,16 +773,45 @@ static void gap_event_handler(esp_gap_ble_cb_event_t event, ESP_LOGI(TAG, "advertising stopped"); break; - case ESP_GAP_BLE_PASSKEY_NOTIF_EVT: - show_passkey(param->ble_security.key_notif.passkey); + case ESP_GAP_BLE_PASSKEY_NOTIF_EVT: { + uint32_t pk = param->ble_security.key_notif.passkey; + /* Banner stays for backward compat with log-scraping tests; + * on_event is additive. */ + show_passkey(pk); + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_PASSKEY_DISPLAY, + .passkey = { .passkey = pk }, + }); break; + } case ESP_GAP_BLE_AUTH_CMPL_EVT: { esp_ble_auth_cmpl_t *a = ¶m->ble_security.auth_cmpl; + /* Pairing has resolved one way or the other; clear any pending + * Passkey-Entry / NC request so the next pairing starts fresh + * and a stale reply from a slow user gets rejected. */ + s_pending_io_kind = PENDING_IO_NONE; if (a->success) { ESP_LOGI(TAG, "pairing ok auth_mode=0x%x", a->auth_mode); + /* Bluedroid has no `key_size` field on auth_cmpl; we + * forced 16 in configure_security() (ESP_BLE_SM_MAX_KEY_SIZE). + * Authenticated/bonded come from the negotiated auth_mode + * bitfield (ESP_LE_AUTH_BOND=bit0, REQ_MITM=bit2, SC=bit3). */ + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_LINK_SECURE, + .link_secure = { + .encrypted = true, + .authenticated = !!(a->auth_mode & ESP_LE_AUTH_REQ_MITM), + .bonded = !!(a->auth_mode & ESP_LE_AUTH_BOND), + .key_size = 16, + }, + }); } else { ESP_LOGW(TAG, "pairing failed reason=0x%x", a->fail_reason); + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_PAIRING_FAILED, + .pairing_failed = { .reason = (int)a->fail_reason }, + }); } break; } @@ -649,14 +825,50 @@ static void gap_event_handler(esp_gap_ble_cb_event_t event, param->ble_security.ble_key.key_type); break; - case ESP_GAP_BLE_NC_REQ_EVT: - /* Numeric Comparison shouldn't fire with our DisplayOnly IO - * (BT Core §2.3.5.1). Reject — accepting would flag the LTK - * as MITM-authenticated without any user actually comparing - * the digits, silently downgrading the security we asked for. */ - esp_ble_confirm_reply(param->ble_security.ble_req.bd_addr, false); + case ESP_GAP_BLE_PASSKEY_REQ_EVT: + /* Central is asking us to enter a passkey it just displayed. + * Cache the peer + flavour so ble_uart_passkey_reply() knows + * where to inject; the application now owes us a reply. */ + ESP_LOGI(TAG, "passkey entry requested from " ESP_BD_ADDR_STR, + ESP_BD_ADDR_HEX(param->ble_security.ble_req.bd_addr)); + memcpy(s_pending_io_bda, param->ble_security.ble_req.bd_addr, + sizeof(s_pending_io_bda)); + s_pending_io_kind = PENDING_IO_PASSKEY; + emit_evt(&(ble_uart_evt_t){ .id = BLE_UART_EVT_PASSKEY_REQUEST }); break; + case ESP_GAP_BLE_NC_REQ_EVT: { + /* Numeric Comparison: both ends should display the same + * 6-digit value. We surface it via on_event and wait for the + * application to confirm via ble_uart_compare_reply(). + * + * Backstop: with no on_event registered we'd silently hang + * the SM until pairing times out. resolve_sec_policy already + * rejects that combination at install time (DISPLAY_YES_NO / + * KEYBOARD_DISPLAY both require on_event), but a peer can + * still trigger NC against an AUTO io_cap that resolved to + * DisplayOnly — extremely unlikely in practice (would need + * the central to *also* run with DisplayOnly), but if it + * does happen we reject the comparison rather than silently + * accept and pretend the user verified the digits. */ + uint32_t cmp = param->ble_security.key_notif.passkey; + if (s_cfg.on_event == NULL) { + ESP_LOGW(TAG, "NC_REQ but no on_event handler; rejecting"); + esp_ble_confirm_reply(param->ble_security.ble_req.bd_addr, false); + break; + } + ESP_LOGI(TAG, "numeric compare %06" PRIu32 " from " ESP_BD_ADDR_STR, + cmp, ESP_BD_ADDR_HEX(param->ble_security.ble_req.bd_addr)); + memcpy(s_pending_io_bda, param->ble_security.ble_req.bd_addr, + sizeof(s_pending_io_bda)); + s_pending_io_kind = PENDING_IO_NUMCMP; + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_NUMERIC_COMPARE, + .numeric_compare = { .passkey = cmp }, + }); + break; + } + default: break; } @@ -705,14 +917,307 @@ int ble_uart_tx(const uint8_t *data, size_t len) bool ble_uart_is_connected(void) { return s_conn_id != 0xFFFF; } bool ble_uart_is_subscribed(void) { return s_subscribed; } +/* ===== Event dispatch ================================================= */ + +/* NULL-safe forwarder so each call site stays one-liner. Runs on the + * BTC task; emit_evt's caller owns the (typically stack-allocated) + * ble_uart_evt_t. */ +static void emit_evt(const ble_uart_evt_t *evt) +{ + if (s_cfg.on_event != NULL) { + s_cfg.on_event(evt); + } +} + +/* ===== Pairing replies ================================================ */ + +/* Snapshot the pending request, validate against the expected kind, + * issue the matching SDK reply, clear pending state. Mirror of the + * NimBLE backend's do_pairing_reply. */ +static int do_pairing_reply(pending_io_kind_t expected, + uint32_t passkey, + bool accept) +{ + pending_io_kind_t kind = s_pending_io_kind; + if (kind == PENDING_IO_NONE || kind != expected) { + return BLE_UART_ENOTCONN; + } + + /* Snapshot the address; clear pending state up front so a + * re-entrant on_event triggered by the SDK reply doesn't see + * stale state. (esp_ble_passkey_reply / confirm_reply are + * synchronous on Bluedroid.) */ + esp_bd_addr_t bda; + memcpy(bda, s_pending_io_bda, sizeof(bda)); + s_pending_io_kind = PENDING_IO_NONE; + + esp_err_t rc; + if (expected == PENDING_IO_PASSKEY) { + rc = esp_ble_passkey_reply(bda, true, passkey); + } else { /* PENDING_IO_NUMCMP */ + rc = esp_ble_confirm_reply(bda, accept); + } + if (rc != ESP_OK) { + ESP_LOGW(TAG, "%s rc=%s", + expected == PENDING_IO_PASSKEY ? "passkey_reply" : "confirm_reply", + esp_err_to_name(rc)); + return xlate_rc(rc); + } + return BLE_UART_OK; +} + +int ble_uart_passkey_reply(uint32_t passkey) +{ + if (passkey > 999999) { + return BLE_UART_EINVAL; + } + return do_pairing_reply(PENDING_IO_PASSKEY, passkey, false); +} + +int ble_uart_compare_reply(bool match) +{ + return do_pairing_reply(PENDING_IO_NUMCMP, 0, match); +} + +/* ===== Bond management ================================================ */ + +int ble_uart_get_bond_count(size_t *out_count) +{ + if (out_count == NULL || !s_installed) { + return BLE_UART_EINVAL; + } + int n = esp_ble_get_bond_device_num(); + if (n < 0) { + ESP_LOGW(TAG, "get_bond_device_num rc=%d", n); + return BLE_UART_EFAIL; + } + *out_count = (size_t)n; + return BLE_UART_OK; +} + +int ble_uart_get_bonded_peers(ble_uart_addr_t *out, size_t cap, size_t *out_count) +{ + if (out_count == NULL || !s_installed + || (out == NULL && cap > 0)) { + return BLE_UART_EINVAL; + } + int total = esp_ble_get_bond_device_num(); + if (total < 0) { + ESP_LOGW(TAG, "get_bond_device_num rc=%d", total); + return BLE_UART_EFAIL; + } + if (total == 0) { + *out_count = 0; + return BLE_UART_OK; + } + if (cap == 0) { + *out_count = (size_t)total; + return BLE_UART_OK; + } + + /* esp_ble_get_bond_device_list expects a buffer sized to `total` + * (it takes dev_num as in/out — the input must be ≥ actual). Heap + * because esp_ble_bond_dev_t is ~80 B per entry. */ + esp_ble_bond_dev_t *list = calloc((size_t)total, sizeof(*list)); + if (list == NULL) { + return BLE_UART_ENOMEM; + } + int got = total; + esp_err_t rc = esp_ble_get_bond_device_list(&got, list); + if (rc != ESP_OK) { + ESP_LOGW(TAG, "get_bond_device_list rc=%s", esp_err_to_name(rc)); + free(list); + return xlate_rc(rc); + } + + /* Marshal at most `cap` entries; report total count regardless so + * a caller with an under-sized buffer learns to retry. */ + size_t to_copy = ((size_t)got < cap) ? (size_t)got : cap; + for (size_t i = 0; i < to_copy; i++) { + memcpy(out[i].bytes, list[i].bd_addr, 6); + out[i].type = + (list[i].bd_addr_type == BLE_ADDR_TYPE_PUBLIC + || list[i].bd_addr_type == BLE_ADDR_TYPE_RPA_PUBLIC) + ? BLE_UART_ADDR_TYPE_PUBLIC + : BLE_UART_ADDR_TYPE_RANDOM; + } + free(list); + *out_count = (size_t)got; + return BLE_UART_OK; +} + +int ble_uart_remove_peer(const ble_uart_addr_t *peer) +{ + if (peer == NULL || !s_installed) { + return BLE_UART_EINVAL; + } + /* esp_bd_addr_t is uint8_t[6] in MSB-first order, identical to + * our public ble_uart_addr_t.bytes — pass through. The address + * type is not part of esp_ble_remove_bond_device's contract: + * Bluedroid identifies bonds by BD address alone. */ + esp_bd_addr_t bd; + memcpy(bd, peer->bytes, sizeof(bd)); + esp_err_t rc = esp_ble_remove_bond_device(bd); + if (rc != ESP_OK) { + ESP_LOGW(TAG, "remove_bond_device rc=%s", esp_err_to_name(rc)); + return xlate_rc(rc); + } + return BLE_UART_OK; +} + +int ble_uart_clear_bonds(void) +{ + if (!s_installed) { + return BLE_UART_EINVAL; + } + int n = esp_ble_get_bond_device_num(); + if (n < 0) { + ESP_LOGW(TAG, "get_bond_device_num rc=%d", n); + return BLE_UART_EFAIL; + } + if (n == 0) { + return BLE_UART_OK; + } + + /* Pull the full list once. Removing entries one-by-one inside + * the iterator would not be safe — esp_ble_remove_bond_device + * mutates the underlying SMP list. Heap-allocate to avoid a + * worst-case stack burst (each esp_ble_bond_dev_t is ~80 B). */ + esp_ble_bond_dev_t *list = calloc((size_t)n, sizeof(*list)); + if (list == NULL) { + return BLE_UART_ENOMEM; + } + esp_err_t rc = esp_ble_get_bond_device_list(&n, list); + if (rc != ESP_OK) { + ESP_LOGW(TAG, "get_bond_device_list rc=%s", esp_err_to_name(rc)); + free(list); + return xlate_rc(rc); + } + + /* Remove each. Record the first failure but keep going so a + * single corrupt entry doesn't strand the rest. */ + esp_err_t first_err = ESP_OK; + for (int i = 0; i < n; i++) { + esp_err_t e = esp_ble_remove_bond_device(list[i].bd_addr); + if (e != ESP_OK && first_err == ESP_OK) { + first_err = e; + ESP_LOGW(TAG, "remove_bond_device[%d] rc=%s", + i, esp_err_to_name(e)); + } + } + free(list); + return first_err == ESP_OK ? BLE_UART_OK : xlate_rc(first_err); +} + /* ===== Lifecycle ====================================================== */ -static int configure_security(bool encrypted) +/* Resolved view of cfg.encrypted + the per-feature overrides + * (cfg.sc / cfg.bonding / cfg.mitm / cfg.io_cap). Computed once in + * install() and consumed by configure_security() / build_attr_table(). */ +struct sec_policy { + bool sc; + bool bonding; + bool mitm; + bool link_enc; /* derived: sc || bonding || mitm */ + esp_ble_io_cap_t iocap; /* ESP_IO_CAP_OUT / NONE */ + esp_ble_auth_req_t auth_req;/* assembled bit-mask, see below */ +}; + +static int resolve_sec_policy(const ble_uart_config_t *cfg, + struct sec_policy *out) { - esp_ble_auth_req_t auth_req = encrypted ? ESP_LE_AUTH_REQ_SC_MITM_BOND - : ESP_LE_AUTH_NO_BOND; - esp_ble_io_cap_t iocap = encrypted ? ESP_IO_CAP_OUT - : ESP_IO_CAP_NONE; + const ble_uart_security_t *sec = &cfg->security; + + /* Range-check the public enums up front. Accepting (say) a + * dangling 99 here would propagate to esp_ble_gap_set_security_param + * as garbage and the SM would refuse pairing for non-obvious reasons. */ + if ((unsigned)sec->sc > BLE_UART_SEC_ON + || (unsigned)sec->bonding > BLE_UART_SEC_ON + || (unsigned)sec->mitm > BLE_UART_SEC_ON + || (unsigned)sec->io_cap > BLE_UART_IO_CAP_KEYBOARD_DISPLAY) { + return BLE_UART_EINVAL; + } + + /* Input-capable IO caps fire BLE_UART_EVT_PASSKEY_REQUEST or + * BLE_UART_EVT_NUMERIC_COMPARE and need an application reply via + * ble_uart_passkey_reply / ble_uart_compare_reply. With on_event + * NULL the caller would never see the request and pairing would + * silently stall until the SM times out — fail synchronously. + * + * This checks the *configured* io_cap, not the value resolved + * below. AUTO and DISPLAY_ONLY are excluded on purpose: AUTO with + * mitm=ON becomes DisplayOnly; the central enters the passkey we + * generate — no ble_uart_passkey_reply() / compare_reply() needed. + * BLE_UART_EVT_PASSKEY_DISPLAY is additive when on_event is set. */ + if (cfg->on_event == NULL + && (sec->io_cap == BLE_UART_IO_CAP_KEYBOARD_ONLY + || sec->io_cap == BLE_UART_IO_CAP_DISPLAY_YES_NO + || sec->io_cap == BLE_UART_IO_CAP_KEYBOARD_DISPLAY)) { + return BLE_UART_EINVAL; + } + + /* AUTO inherits the bit from cfg.encrypted; OFF / ON override. */ + bool preset = cfg->encrypted; + out->sc = (sec->sc == BLE_UART_SEC_AUTO) ? preset + : (sec->sc == BLE_UART_SEC_ON); + out->bonding = (sec->bonding == BLE_UART_SEC_AUTO) ? preset + : (sec->bonding == BLE_UART_SEC_ON); + out->mitm = (sec->mitm == BLE_UART_SEC_AUTO) ? preset + : (sec->mitm == BLE_UART_SEC_ON); + /* "Link will be encrypted" iff the SM runs at all — and the SM + * runs whenever any of these three bits is set. Pairing-without- + * bonding still encrypts the live link with a session LTK. */ + out->link_enc = out->sc || out->bonding || out->mitm; + + /* IO capability: AUTO picks the minimum that lets the resolved + * MITM bit succeed; the explicit values map straight to the + * Bluedroid ESP_IO_CAP_* constants used by the SM. */ + switch (sec->io_cap) { + case BLE_UART_IO_CAP_DISPLAY_ONLY: + out->iocap = ESP_IO_CAP_OUT; + break; + case BLE_UART_IO_CAP_NO_INPUT_OUTPUT: + out->iocap = ESP_IO_CAP_NONE; + break; + case BLE_UART_IO_CAP_KEYBOARD_ONLY: + out->iocap = ESP_IO_CAP_IN; + break; + case BLE_UART_IO_CAP_DISPLAY_YES_NO: + out->iocap = ESP_IO_CAP_IO; + break; + case BLE_UART_IO_CAP_KEYBOARD_DISPLAY: + out->iocap = ESP_IO_CAP_KBDISP; + break; + case BLE_UART_IO_CAP_AUTO: + default: + out->iocap = out->mitm ? ESP_IO_CAP_OUT : ESP_IO_CAP_NONE; + break; + } + + /* Just Works (NoInputNoOutput) cannot satisfy MITM — the SM + * would reject pairing in flight. Catch it synchronously here. */ + if (out->mitm && out->iocap == ESP_IO_CAP_NONE) { + return BLE_UART_EINVAL; + } + + /* Bluedroid's auth_req is a bit-mask: + * bit 0 = ESP_LE_AUTH_BOND + * bit 2 = ESP_LE_AUTH_REQ_MITM + * bit 3 = ESP_LE_AUTH_REQ_SC_ONLY + * The combined ESP_LE_AUTH_REQ_SC_MITM_BOND etc. constants are + * just convenience names for those bit unions — assembling from + * the individual flags here mirrors any combination cleanly. */ + out->auth_req = (esp_ble_auth_req_t)( + (out->bonding ? ESP_LE_AUTH_BOND : 0) + | (out->mitm ? ESP_LE_AUTH_REQ_MITM : 0) + | (out->sc ? ESP_LE_AUTH_REQ_SC_ONLY : 0)); + return BLE_UART_OK; +} + +static int configure_security(const struct sec_policy *pol) +{ + esp_ble_auth_req_t auth_req = pol->auth_req; + esp_ble_io_cap_t iocap = pol->iocap; uint8_t key_size = 16; uint8_t init_key = ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK; uint8_t rsp_key = ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK; @@ -754,6 +1259,83 @@ int ble_uart_install(const ble_uart_config_t *cfg) memset(&s_cfg, 0, sizeof(s_cfg)); } + /* Validate device_name length up front. Beyond + * BLE_UART_DEVICE_NAME_MAX the default-path advertising would + * silently fail at config_adv_data time; surfacing the error here + * is much friendlier. strnlen with cap+1 also stops a missing-NUL + * caller buffer from running into uninitialised memory. */ + if (s_cfg.device_name != NULL) { + size_t nlen = strnlen(s_cfg.device_name, BLE_UART_DEVICE_NAME_MAX + 1); + if (nlen > BLE_UART_DEVICE_NAME_MAX) { + ESP_LOGE(TAG, "device_name too long: > %u bytes", + (unsigned)BLE_UART_DEVICE_NAME_MAX); + memset(&s_cfg, 0, sizeof(s_cfg)); + return BLE_UART_EINVAL; + } + } + + /* Validate caller-supplied advertising payloads up front so an + * oversized buffer fails the install instead of corrupting the + * adv packet at start time (where errors only surface in logs). + * (NULL + len>0 is also rejected — almost always a caller bug.) */ + if (s_cfg.adv_data_len > BLE_UART_ADV_DATA_MAX + || (s_cfg.adv_data == NULL && s_cfg.adv_data_len > 0)) { + ESP_LOGE(TAG, "bad adv_data: ptr=%p len=%u (max=%u)", + s_cfg.adv_data, + (unsigned)s_cfg.adv_data_len, + (unsigned)BLE_UART_ADV_DATA_MAX); + memset(&s_cfg, 0, sizeof(s_cfg)); + return BLE_UART_EINVAL; + } + if (s_cfg.scan_rsp_data_len > BLE_UART_SCAN_RSP_DATA_MAX + || (s_cfg.scan_rsp_data == NULL && s_cfg.scan_rsp_data_len > 0)) { + ESP_LOGE(TAG, "bad scan_rsp_data: ptr=%p len=%u (max=%u)", + s_cfg.scan_rsp_data, + (unsigned)s_cfg.scan_rsp_data_len, + (unsigned)BLE_UART_SCAN_RSP_DATA_MAX); + memset(&s_cfg, 0, sizeof(s_cfg)); + return BLE_UART_EINVAL; + } + + /* Resolve cfg.encrypted + per-feature overrides into a flat + * policy. Validation (out-of-range enums + impossible MITM/IO + * combination) happens up front so install() rejects bad cfgs + * synchronously, before any host-stack resources are allocated. */ + struct sec_policy pol; + int srv = resolve_sec_policy(&s_cfg, &pol); + if (srv != BLE_UART_OK) { + ESP_LOGE(TAG, "bad security cfg: encrypted=%d sc=%d bonding=%d " + "mitm=%d io_cap=%d", + (int)s_cfg.encrypted, + (int)s_cfg.security.sc, (int)s_cfg.security.bonding, + (int)s_cfg.security.mitm, (int)s_cfg.security.io_cap); + memset(&s_cfg, 0, sizeof(s_cfg)); + return srv; + } + s_link_encrypted = pol.link_enc; + s_mitm_required = pol.mitm; + + /* Copy raw payloads now (caller's pointers may not outlive install). + * For adv_data we also prepend the 3-byte Flags AD ourselves — + * the controller-visible Flags element is library-controlled and + * not part of what the application owns. */ + s_adv_data_len = 0; + s_scan_rsp_len = 0; + if (s_cfg.adv_data != NULL && s_cfg.adv_data_len > 0) { + s_adv_data_buf[0] = 0x02; /* AD length */ + s_adv_data_buf[1] = 0x01; /* AD type: Flags */ + s_adv_data_buf[2] = ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT; + memcpy(s_adv_data_buf + 3, s_cfg.adv_data, s_cfg.adv_data_len); + s_adv_data_len = (uint8_t)(3 + s_cfg.adv_data_len); + } + if (s_cfg.scan_rsp_data != NULL && s_cfg.scan_rsp_data_len > 0) { + memcpy(s_scan_rsp_buf, s_cfg.scan_rsp_data, s_cfg.scan_rsp_data_len); + s_scan_rsp_len = (uint8_t)s_cfg.scan_rsp_data_len; + } + /* Drop the pointers — install must not retain caller buffers. */ + s_cfg.adv_data = NULL; + s_cfg.scan_rsp_data = NULL; + /* Free BR/EDR controller RAM we won't use (no-op on BLE-only chips). */ esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); @@ -813,7 +1395,7 @@ int ble_uart_install(const ble_uart_config_t *cfg) /* SM must be configured before app_register so any incoming * pairing request finds the right policy. */ - int srv = configure_security(s_cfg.encrypted); + srv = configure_security(&pol); if (srv != BLE_UART_OK) { ESP_LOGE(TAG, "security config failed rc=%d", srv); rc = ESP_FAIL; @@ -830,7 +1412,7 @@ int ble_uart_install(const ble_uart_config_t *cfg) esp_err_to_name(rc)); } - build_attr_table(s_cfg.encrypted); + build_attr_table(s_link_encrypted, s_mitm_required); rc = esp_ble_gatts_app_register(UART_APP_ID); if (rc != ESP_OK) { @@ -908,7 +1490,11 @@ int ble_uart_open(void) return BLE_UART_OK; } -int ble_uart_close(void) +/* Body of ble_uart_close(); also called directly by the close-async + * worker, which has already latched s_closing itself. The public + * wrapper below uses s_closing to reject a sync close that races + * with an in-flight async close. */ +static int do_close(void) { if (!s_opened) { return BLE_UART_EALREADY; @@ -951,32 +1537,115 @@ int ble_uart_close(void) return BLE_UART_OK; } +int ble_uart_close(void) +{ + /* If a ble_uart_close_async() worker is in flight, the close + * sequence is already running on the worker's task — let it + * finish rather than racing it from here. The worker drives + * s_opened to false on its own, so the next sync close after + * the worker drains will get the natural !s_opened EALREADY. */ + if (s_closing) { + return BLE_UART_EALREADY; + } + return do_close(); +} + +/* ===== Async close ==================================================== */ + +/* Background worker spawned by ble_uart_close_async(). Lives just + * long enough to run the synchronous close path (which blocks up to + * 500 ms waiting for DISCONNECT_EVT), then fires the completion event + * and self-deletes. Spawned as a separate task so on_event handlers + * running on the BTC task aren't pinned by the disconnect wait. */ +static void close_async_task(void *arg) +{ + (void)arg; + + /* Bypass the s_closing gate in ble_uart_close(): we ARE the + * in-flight async close that gate is meant to protect against. */ + int rc = do_close(); + if (rc != BLE_UART_OK && rc != BLE_UART_EALREADY) { + ESP_LOGW(TAG, "close_async: do_close rc=%d", rc); + } + + /* Deliver CLOSED on the worker task. Applications must defer + * ble_uart_uninstall() to another task (PORTING.md §5.3.2). + * Concurrent uninstall() may clear s_cfg while we read on_event. */ + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_CLOSED, + .closed = { .status = rc }, + }); + + s_closing = false; + vTaskDelete(NULL); +} + +int ble_uart_close_async(void) +{ + /* Same-state checks as the synchronous variant: nothing to close + * if we never opened, and no point spawning a second worker if + * the first hasn't drained yet. */ + if (!s_opened || s_closing) { + return BLE_UART_EALREADY; + } + + /* Latch BEFORE spawning so a racing caller (different task) sees + * the in-flight state immediately and gets EALREADY. */ + s_closing = true; + + /* 3 KB is comfortably more than the close path uses (a couple of + * GAP API calls + a 50×10ms vTaskDelay loop); bump if you wedge + * a heavy on_event handler between adv_stop and CLOSED. */ + BaseType_t ok = xTaskCreate(close_async_task, "ble_close", + 3072, NULL, + tskIDLE_PRIORITY + 2, NULL); + if (ok != pdPASS) { + s_closing = false; + return BLE_UART_ENOMEM; + } + return BLE_UART_OK; +} + int ble_uart_uninstall(void) { if (!s_installed) { return BLE_UART_EALREADY; } + /* If a ble_uart_close_async() worker is still draining, poll s_closing + * for up to ~5 s before touching shared state. On timeout, teardown + * continues anyway — applications must follow PORTING.md §5.3.2 so + * uninstall runs only after the worker has finished. */ + for (int i = 0; i < 500 && s_closing; i++) { + vTaskDelay(pdMS_TO_TICKS(10)); + } + if (s_closing) { + ESP_LOGW(TAG, "uninstall: close_async worker still running, " + "tearing down anyway"); + } + /* Best-effort cleanup. We MUST NOT early-return on a per-step * failure: that would leave s_installed=true with the SDK in * some half-torn-down state, blocking both re-install and retry. * Mirror the install() goto-fail philosophy: record the first * error, keep tearing down, and always wipe our state. */ - esp_err_t first_err = ESP_OK; + int first_rc = BLE_UART_OK; if (s_opened) { int rc = ble_uart_close(); if (rc != BLE_UART_OK && rc != BLE_UART_EALREADY) { ESP_LOGE(TAG, "ble_uart_close rc=%d", rc); - if (first_err == ESP_OK) first_err = rc; + if (first_rc == BLE_UART_OK) { + first_rc = rc; + } } } if (s_gatts_if != ESP_GATT_IF_NONE) { esp_err_t rc = esp_ble_gatts_app_unregister(s_gatts_if); - if (rc != ESP_OK && first_err == ESP_OK) { + if (rc != ESP_OK && first_rc == BLE_UART_OK) { ESP_LOGE(TAG, "gatts_app_unregister rc=%s", esp_err_to_name(rc)); - first_err = rc; + first_rc = xlate_rc(rc); } s_gatts_if = ESP_GATT_IF_NONE; } @@ -984,22 +1653,30 @@ int ble_uart_uninstall(void) esp_err_t rc = esp_bluedroid_disable(); if (rc != ESP_OK) { ESP_LOGE(TAG, "bluedroid_disable rc=%s", esp_err_to_name(rc)); - if (first_err == ESP_OK) first_err = rc; + if (first_rc == BLE_UART_OK) { + first_rc = xlate_rc(rc); + } } rc = esp_bluedroid_deinit(); if (rc != ESP_OK) { ESP_LOGE(TAG, "bluedroid_deinit rc=%s", esp_err_to_name(rc)); - if (first_err == ESP_OK) first_err = rc; + if (first_rc == BLE_UART_OK) { + first_rc = xlate_rc(rc); + } } rc = esp_bt_controller_disable(); if (rc != ESP_OK) { ESP_LOGE(TAG, "controller_disable rc=%s", esp_err_to_name(rc)); - if (first_err == ESP_OK) first_err = rc; + if (first_rc == BLE_UART_OK) { + first_rc = xlate_rc(rc); + } } rc = esp_bt_controller_deinit(); if (rc != ESP_OK) { ESP_LOGE(TAG, "controller_deinit rc=%s", esp_err_to_name(rc)); - if (first_err == ESP_OK) first_err = rc; + if (first_rc == BLE_UART_OK) { + first_rc = xlate_rc(rc); + } } /* Wipe state unconditionally, even on partial failure. */ @@ -1012,11 +1689,18 @@ int ble_uart_uninstall(void) s_installed = false; s_opened = false; s_shutting_down = false; + s_closing = false; s_attr_tab_ready = false; s_adv_active = false; s_adv_config_done = 0; + s_adv_data_len = 0; + s_scan_rsp_len = 0; + s_link_encrypted = false; + s_mitm_required = false; + s_pending_io_kind = PENDING_IO_NONE; + memset(s_pending_io_bda, 0, sizeof(s_pending_io_bda)); prep_reset(); - return first_err == ESP_OK ? BLE_UART_OK : xlate_rc(first_err); + return first_rc; } #endif /* CONFIG_BT_BLUEDROID_ENABLED */ diff --git a/examples/bluetooth/common/ble_uart/ble_uart_nimble.c b/examples/bluetooth/common/ble_uart/ble_uart_nimble.c index c1c515c51f6..9887240c517 100644 --- a/examples/bluetooth/common/ble_uart/ble_uart_nimble.c +++ b/examples/bluetooth/common/ble_uart/ble_uart_nimble.c @@ -16,6 +16,7 @@ #include #include +#include #include #include "freertos/FreeRTOS.h" @@ -59,6 +60,25 @@ static int xlate_rc(int nimble_rc) } } +/* Collapse NimBLE's 4-value peer addr type (0–3) into our public + * 2-value enum (identity types map onto public/random). */ +static uint8_t nimble_peer_type_to_uart(uint8_t nimble_type) +{ + return (nimble_type == BLE_ADDR_PUBLIC || + nimble_type == BLE_ADDR_PUBLIC_ID) + ? BLE_UART_ADDR_TYPE_PUBLIC + : BLE_UART_ADDR_TYPE_RANDOM; +} + +/* Marshal a NimBLE ble_addr_t into our public ble_uart_addr_t. */ +static void from_nimble_addr(const ble_addr_t *src, ble_uart_addr_t *dst) +{ + dst->type = nimble_peer_type_to_uart(src->type); + for (int i = 0; i < 6; i++) { + dst->bytes[i] = src->val[5 - i]; + } +} + /* Provided by NimBLE's `store/config` lib. */ extern void ble_store_config_init(void); @@ -89,9 +109,10 @@ static const ble_uuid128_t s_chr_tx_uuid = BLE_UUID128_INIT(NUS_TX_BYTES); #define RX_SCRATCH CONFIG_BLE_UART_RX_SCRATCH_SIZE /* Cached device name. Avoids ble_svc_gap_device_name() which returns - * NULL when CONFIG_BT_NIMBLE_GAP_SERVICE=n (would NULL-deref). 32B - * covers the BLE 31-byte adv-payload limit + NUL. */ -#define DEV_NAME_MAX 32 + * NULL when CONFIG_BT_NIMBLE_GAP_SERVICE=n (would NULL-deref). The + * cap is BLE_UART_DEVICE_NAME_MAX (validated in install) + NUL; we + * round up for safety margin. */ +#define DEV_NAME_MAX (BLE_UART_DEVICE_NAME_MAX + 2) static ble_uart_config_t s_cfg; static char s_dev_name[DEV_NAME_MAX]; @@ -101,9 +122,60 @@ static volatile uint16_t s_conn_handle = BLE_HS_CONN_HANDLE_NONE; static bool s_subscribed; static bool s_installed; static bool s_opened; +/* After close(), ble_gatts_stop() drops svc-def pointers; open() must + * count/add again before the next ble_hs_start(). Cleared on install. */ +static bool s_gatts_needs_readd; +#if MYNEWT_VAL(BLE_HS_AUTO_START) +/* Set in install() when nimble_port_init() queues the one-shot AUTO_START + * event; cleared on first open() so we don't also ble_hs_sched_start() and + * trip assert(rc==0) in ble_hs_event_start_stage2 (BLE_HS_EALREADY). */ +static bool s_hs_auto_start_pending; +#endif static bool s_shutting_down; /* gates auto-readvertise during close */ +/* Set by ble_uart_close_async() when its worker task is in flight, + * cleared by the worker just before it exits. uninstall() polls this + * to drain a pending async close before tearing the port down. */ +static volatile bool s_closing; static uint8_t s_own_addr_type; +/* Resolved security policy. Computed once in install() from cfg.encrypted + * + the per-feature overrides (cfg.sc/bonding/mitm/io_cap), then read + * in the GAP event handler and the GATT-table builder. + * s_link_encrypted = true if any of {sc, bonding, mitm} resolved ON + * → kick pairing on connect, require encryption on chars + * s_mitm_required = resolved mitm bit + * → require AUTHEN flag on chars (Just-Works peer cannot read/write) */ +static bool s_link_encrypted; +static bool s_mitm_required; + +/* Pending Passkey-Entry / Numeric-Comparison request awaiting an + * application reply via ble_uart_passkey_reply / ble_uart_compare_reply. + * + * s_pending_io_conn — conn_handle the SM is asking about, or + * BLE_HS_CONN_HANDLE_NONE if no request is in + * flight. Set in PASSKEY_ACTION, cleared on + * reply, on disconnect, and on enc_change. + * s_pending_io_action — BLE_SM_IOACT_INPUT or BLE_SM_IOACT_NUMCMP; + * used to reject mismatched reply calls (e.g. + * passkey_reply during NUMCMP). + * + * No FreeRTOS lock — both fields are written only from the host task, + * and the reply API is the only outside reader. The reader takes a + * local snapshot before injecting. */ +static volatile uint16_t s_pending_io_conn = BLE_HS_CONN_HANDLE_NONE; +static volatile uint8_t s_pending_io_action; + +/* Optional user-supplied advertising payloads. When `s_adv_data_len` + * is non-zero we feed `s_adv_data` straight to ble_gap_adv_set_data; + * the buffer always carries the 3-byte Flags AD element we built in + * install() followed by the user's bytes. Same for the scan response + * (no Flags element there). Zero length means "use the default + * field-builder path in start_advertising()". */ +static uint8_t s_adv_data[3 + BLE_UART_ADV_DATA_MAX]; +static uint8_t s_adv_data_len; +static uint8_t s_scan_rsp_data[BLE_UART_SCAN_RSP_DATA_MAX]; +static uint8_t s_scan_rsp_data_len; + static int gap_event(struct ble_gap_event *event, void *arg); static int start_advertising(void); @@ -144,21 +216,35 @@ static int chr_access(uint16_t conn_handle, uint16_t attr_handle, * NOTIFY_INDICATE_* (not from READ/WRITE_*), so notify-only chars need * the NOTIFY_INDICATE mask, not just the RW mask — otherwise an * unpaired central could subscribe and receive notifications over the - * unencrypted link (see ble_gatts.c:ble_gatts_chr_clt_cfg_flags_from_chr_flags). */ -#define CHR_FLAG_RW_ENC (BLE_GATT_CHR_F_READ_ENC | BLE_GATT_CHR_F_READ_AUTHEN | \ - BLE_GATT_CHR_F_WRITE_ENC | BLE_GATT_CHR_F_WRITE_AUTHEN) -#define CHR_FLAG_NOTIFY_ENC (BLE_GATT_CHR_F_NOTIFY_INDICATE_ENC | \ - BLE_GATT_CHR_F_NOTIFY_INDICATE_AUTHEN) + * unencrypted link (see ble_gatts.c:ble_gatts_chr_clt_cfg_flags_from_chr_flags). + * + * The _ENC and _AUTHEN halves are split so an encrypted-but-unauthenticated + * (Just Works) link still passes when mitm=OFF — _AUTHEN gates on the + * link's authenticated bit which Just Works doesn't set. */ +#define CHR_FLAG_RW_ENC (BLE_GATT_CHR_F_READ_ENC | \ + BLE_GATT_CHR_F_WRITE_ENC) +#define CHR_FLAG_RW_AUTHEN (BLE_GATT_CHR_F_READ_AUTHEN | \ + BLE_GATT_CHR_F_WRITE_AUTHEN) +#define CHR_FLAG_NOTIFY_ENC (BLE_GATT_CHR_F_NOTIFY_INDICATE_ENC) +#define CHR_FLAG_NOTIFY_AUTHEN (BLE_GATT_CHR_F_NOTIFY_INDICATE_AUTHEN) static struct ble_gatt_chr_def s_chr_defs[3]; static struct ble_gatt_svc_def s_svc_defs[2]; -static void build_gatt_table(bool encrypted) +static void build_gatt_table(bool link_enc, bool mitm) { /* `ble_gatt_chr_flags` is uint32_t — match width here so the * 0x10000-and-above NOTIFY_INDICATE flags don't get truncated. */ - ble_gatt_chr_flags rw_enc = encrypted ? CHR_FLAG_RW_ENC : 0; - ble_gatt_chr_flags notify_enc = encrypted ? CHR_FLAG_NOTIFY_ENC : 0; + ble_gatt_chr_flags rw_enc = 0; + ble_gatt_chr_flags notify_enc = 0; + if (link_enc) { + rw_enc |= CHR_FLAG_RW_ENC; + notify_enc |= CHR_FLAG_NOTIFY_ENC; + if (mitm) { + rw_enc |= CHR_FLAG_RW_AUTHEN; + notify_enc |= CHR_FLAG_NOTIFY_AUTHEN; + } + } s_chr_defs[0] = (struct ble_gatt_chr_def){ .uuid = &s_chr_rx_uuid.u, @@ -181,16 +267,47 @@ static void build_gatt_table(bool encrypted) s_svc_defs[1] = (struct ble_gatt_svc_def){0}; } +static int register_uart_gatt_svc(void) +{ + build_gatt_table(s_link_encrypted, s_mitm_required); + + int rc = ble_gatts_count_cfg(s_svc_defs); + if (rc != 0) { + ESP_LOGE(TAG, "ble_gatts_count_cfg rc=%d", rc); + return xlate_rc(rc); + } + rc = ble_gatts_add_svcs(s_svc_defs); + if (rc != 0) { + ESP_LOGE(TAG, "ble_gatts_add_svcs rc=%d", rc); + return xlate_rc(rc); + } + return BLE_UART_OK; +} + +/* Re-queue std + UART svc defs after close(). Host stop + gatts_reset clear + * the ATT table and free the svc-def pointer array; only re-adding UART would + * leave GAP/GATT (and anything else added at install) off-air on the next + * ble_hs_start(). ble_svc_*_init() is safe to recall on ESP-IDF: SYSINIT_ASSERT + * is a no-op and gap name storage is not reallocated if already present. */ +static int reregister_gatt_svcs_after_close(void) +{ +#if NIMBLE_BLE_CONNECT + ble_svc_gap_init(); +#endif + ble_svc_gatt_init(); + return register_uart_gatt_svc(); +} + static void register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg) { char buf[BLE_UUID_STR_LEN]; switch (ctxt->op) { case BLE_GATT_REGISTER_OP_SVC: - ESP_LOGI(TAG, "registered service %s handle=%d", + ESP_LOGD(TAG, "registered service %s handle=%d", ble_uuid_to_str(ctxt->svc.svc_def->uuid, buf), ctxt->svc.handle); break; case BLE_GATT_REGISTER_OP_CHR: - ESP_LOGI(TAG, "registered chr %s def=%d val=%d", + ESP_LOGD(TAG, "registered chr %s def=%d val=%d", ble_uuid_to_str(ctxt->chr.chr_def->uuid, buf), ctxt->chr.def_handle, ctxt->chr.val_handle); break; @@ -248,41 +365,74 @@ int ble_uart_tx(const uint8_t *data, size_t len) bool ble_uart_is_connected(void) { return s_conn_handle != BLE_HS_CONN_HANDLE_NONE; } bool ble_uart_is_subscribed(void) { return s_subscribed; } +/* ===== Event dispatch ================================================= */ + +/* Forward a tagged event to the application callback. NULL-safe so all + * call sites stay one-liners; runs on the NimBLE host task — caller + * must keep the local `ble_uart_evt_t` alive across the call (we do + * via stack/compound literal at each site). */ +static void emit_evt(const ble_uart_evt_t *evt) +{ + if (s_cfg.on_event != NULL) { + s_cfg.on_event(evt); + } +} + /* ===== Advertising ==================================================== */ static int start_advertising(void) { - /* 31-byte primary adv can't hold flags + tx_pwr + name + 128-bit - * UUID together, so split: primary = flags+tx_pwr+name, - * scan rsp = 128-bit service UUID. */ - const char *name = s_dev_name; - size_t name_len = strlen(name); + int rc; - struct ble_hs_adv_fields adv = { - .flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP, - .tx_pwr_lvl_is_present = 1, - .tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO, - /* If no name was set, advertise without one (NimBLE accepts - * NULL+0); the service UUID in scan rsp still identifies us. */ - .name = name_len > 0 ? (uint8_t *)name : NULL, - .name_len = name_len, - .name_is_complete = name_len > 0 ? 1 : 0, - }; - int rc = ble_gap_adv_set_fields(&adv); - if (rc != 0) { - ESP_LOGE(TAG, "adv_set_fields rc=%d (name too long?)", rc); - return rc; + /* Two paths: raw-bytes (when the app provided its own payload) + * and field-builder (default). Mixing is allowed — e.g. raw + * adv_data + default scan_rsp. + * + * Default primary payload: Flags AD + Complete Local Name. The + * 128-bit service UUID lives in the scan response (the 31-byte + * primary packet can't hold name + 128-bit UUID together). */ + if (s_adv_data_len > 0) { + rc = ble_gap_adv_set_data(s_adv_data, s_adv_data_len); + if (rc != 0) { + ESP_LOGE(TAG, "adv_set_data rc=%d", rc); + return rc; + } + } else { + const char *name = s_dev_name; + size_t name_len = strlen(name); + + struct ble_hs_adv_fields adv = { + .flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP, + /* If no name was set, advertise without one (NimBLE accepts + * NULL+0); the service UUID in scan rsp still identifies us. */ + .name = name_len > 0 ? (uint8_t *)name : NULL, + .name_len = name_len, + .name_is_complete = name_len > 0 ? 1 : 0, + }; + rc = ble_gap_adv_set_fields(&adv); + if (rc != 0) { + ESP_LOGE(TAG, "adv_set_fields rc=%d (name too long?)", rc); + return rc; + } } - struct ble_hs_adv_fields rsp = { - .uuids128 = &s_svc_uuid, - .num_uuids128 = 1, - .uuids128_is_complete = 1, - }; - rc = ble_gap_adv_rsp_set_fields(&rsp); - if (rc != 0) { - ESP_LOGE(TAG, "adv_rsp_set_fields rc=%d", rc); - return rc; + if (s_scan_rsp_data_len > 0) { + rc = ble_gap_adv_rsp_set_data(s_scan_rsp_data, s_scan_rsp_data_len); + if (rc != 0) { + ESP_LOGE(TAG, "adv_rsp_set_data rc=%d", rc); + return rc; + } + } else { + struct ble_hs_adv_fields rsp = { + .uuids128 = &s_svc_uuid, + .num_uuids128 = 1, + .uuids128_is_complete = 1, + }; + rc = ble_gap_adv_rsp_set_fields(&rsp); + if (rc != 0) { + ESP_LOGE(TAG, "adv_rsp_set_fields rc=%d", rc); + return rc; + } } struct ble_gap_adv_params params = { @@ -295,7 +445,21 @@ static int start_advertising(void) ESP_LOGE(TAG, "adv_start rc=%d", rc); return rc; } - ESP_LOGI(TAG, "advertising as '%s'", name_len > 0 ? name : ""); + /* "advertising as ''" only makes sense when ble_uart owns + * the primary payload — with a caller-supplied adv_data the name + * the scanner sees is whatever bytes the caller put in there, not + * s_dev_name (which is only exposed via the GAP-service Device + * Name characteristic, post-connect). Pick the wording per path. */ + if (s_adv_data_len > 0 || s_scan_rsp_data_len > 0) { + ESP_LOGI(TAG, "advertising with custom payload " + "(adv=%u B, scan_rsp=%u B; GAP-service name='%s')", + (unsigned)s_adv_data_len, + (unsigned)s_scan_rsp_data_len, + s_dev_name[0] ? s_dev_name : ""); + } else { + ESP_LOGI(TAG, "advertising as '%s'", + s_dev_name[0] ? s_dev_name : ""); + } return 0; } @@ -325,9 +489,22 @@ static int gap_event(struct ble_gap_event *event, void *arg) if (event->connect.status == 0) { s_conn_handle = event->connect.conn_handle; s_subscribed = false; + /* Look up the peer's address; on first pair this equals + * peer_ota_addr, on bonded reconnect this is the resolved + * identity address. ble_gap_conn_find should never fail + * for a just-arrived connect event, but guard anyway — + * a zero-address payload is preferable to a stale stack + * read. */ + ble_uart_evt_t e = { .id = BLE_UART_EVT_CONNECTED }; + struct ble_gap_conn_desc d; + if (ble_gap_conn_find(event->connect.conn_handle, &d) == 0) { + from_nimble_addr(&d.peer_id_addr, &e.connected.peer); + } + emit_evt(&e); /* Start pairing immediately (rather than lazily on the - * first encrypted attribute access). */ - if (s_cfg.encrypted) { + * first encrypted attribute access). Resolved policy: + * any of {sc, bonding, mitm} ON → pairing required. */ + if (s_link_encrypted) { ble_gap_security_initiate(event->connect.conn_handle); } } else if (!s_shutting_down) { @@ -339,6 +516,14 @@ static int gap_event(struct ble_gap_event *event, void *arg) ESP_LOGI(TAG, "disconnect reason=%d", event->disconnect.reason); s_conn_handle = BLE_HS_CONN_HANDLE_NONE; s_subscribed = false; + /* Drop any pending Passkey-Entry / NC reply; pairing was + * cancelled along with the link. A stale value here would + * make the next reply call inject into a closed conn. */ + s_pending_io_conn = BLE_HS_CONN_HANDLE_NONE; + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_DISCONNECTED, + .disconnected = { .reason = event->disconnect.reason }, + }); if (!s_shutting_down) { start_advertising(); } @@ -350,18 +535,49 @@ static int gap_event(struct ble_gap_event *event, void *arg) case BLE_GAP_EVENT_ADV_COMPLETE: ESP_LOGI(TAG, "adv_complete reason=%d", event->adv_complete.reason); - if (!s_shutting_down) { + /* Don't auto-restart while a connection is up. Undirected adv + * auto-stops at the LL on connect (BT Core spec), and an + * explicit start while connected would either fail (single- + * conn build, the default) or accept a second peripheral + * link we don't want to handle here. ADV_COMPLETE can still + * arrive in connected state via NimBLE-internal cleanup + * (e.g. resolving-list updates after bonding); ignore it. */ + if (!s_shutting_down && s_conn_handle == BLE_HS_CONN_HANDLE_NONE) { start_advertising(); } return 0; case BLE_GAP_EVENT_ENC_CHANGE: + /* Pairing has resolved one way or the other; clear any pending + * Passkey-Entry / NC request so the next pairing starts fresh. */ + s_pending_io_conn = BLE_HS_CONN_HANDLE_NONE; if (ble_gap_conn_find(event->enc_change.conn_handle, &desc) == 0) { ESP_LOGI(TAG, "enc_change status=%d encrypted=%d authenticated=%d bonded=%d", event->enc_change.status, desc.sec_state.encrypted, desc.sec_state.authenticated, desc.sec_state.bonded); + /* Dispatch on the actual sec_state, not the rc — bonded + * reconnects can finish with status=BLE_HS_ETIMEOUT (13) + * while encrypted=1 thanks to a benign race with the + * peer's auto-encrypt; reporting that as PAIRING_FAILED + * would be wrong. */ + if (desc.sec_state.encrypted) { + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_LINK_SECURE, + .link_secure = { + .encrypted = (bool)desc.sec_state.encrypted, + .authenticated = (bool)desc.sec_state.authenticated, + .bonded = (bool)desc.sec_state.bonded, + .key_size = (uint8_t)desc.sec_state.key_size, + }, + }); + } else { + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_PAIRING_FAILED, + .pairing_failed = { .reason = event->enc_change.status }, + }); + } } return 0; @@ -373,7 +589,8 @@ static int gap_event(struct ble_gap_event *event, void *arg) return BLE_GAP_REPEAT_PAIRING_RETRY; case BLE_GAP_EVENT_PASSKEY_ACTION: - if (event->passkey.params.action == BLE_SM_IOACT_DISP) { + switch (event->passkey.params.action) { + case BLE_SM_IOACT_DISP: { /* Rejection sampling avoids the modulo bias of * `esp_random() % 1000000` (2^32 % 1e6 != 0). */ const uint32_t passkey_max = 1000000U; @@ -387,14 +604,57 @@ static int gap_event(struct ble_gap_event *event, void *arg) .action = BLE_SM_IOACT_DISP, .passkey = r % passkey_max, }; + /* Banner stays for backward compat with log-scraping + * tests; on_event is additive. */ show_passkey(pkey.passkey); + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_PASSKEY_DISPLAY, + .passkey = { .passkey = pkey.passkey }, + }); int rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); if (rc != 0) { - ESP_LOGW(TAG, "ble_sm_inject_io rc=%d", rc); + ESP_LOGW(TAG, "ble_sm_inject_io(DISP) rc=%d", rc); } - } else { - ESP_LOGW(TAG, "passkey action %d not handled (DisplayOnly only)", + break; + } + + case BLE_SM_IOACT_INPUT: + /* Central displays a passkey, user reads it from there + * and types it into our device. We can't inject anything + * yet — wait for ble_uart_passkey_reply(). */ + ESP_LOGI(TAG, "passkey entry requested (conn=%d)", + event->passkey.conn_handle); + s_pending_io_conn = event->passkey.conn_handle; + s_pending_io_action = BLE_SM_IOACT_INPUT; + emit_evt(&(ble_uart_evt_t){ .id = BLE_UART_EVT_PASSKEY_REQUEST }); + break; + + case BLE_SM_IOACT_NUMCMP: + /* Both sides should display the same 6-digit value; user + * confirms match. The value is in `numcmp` (already a + * decimal 0..999999, computed by the SM). */ + ESP_LOGI(TAG, "numeric compare %06" PRIu32 " (conn=%d)", + event->passkey.params.numcmp, + event->passkey.conn_handle); + s_pending_io_conn = event->passkey.conn_handle; + s_pending_io_action = BLE_SM_IOACT_NUMCMP; + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_NUMERIC_COMPARE, + .numeric_compare = { .passkey = event->passkey.params.numcmp }, + }); + break; + + case BLE_SM_IOACT_OOB: + /* OOB plumbing is intentionally not exposed. Letting the + * SM hang here would surface as a pairing timeout — log + * loudly and let it. */ + ESP_LOGW(TAG, "OOB pairing requested but not implemented"); + break; + + default: + ESP_LOGW(TAG, "unexpected passkey action %d", event->passkey.params.action); + break; } return 0; @@ -407,7 +667,16 @@ static int gap_event(struct ble_gap_event *event, void *arg) ESP_LOGI(TAG, "subscribe attr=%d cur_notify=%d", event->subscribe.attr_handle, event->subscribe.cur_notify); if (event->subscribe.attr_handle == s_tx_val_handle) { - s_subscribed = (event->subscribe.cur_notify != 0); + bool sub = (event->subscribe.cur_notify != 0); + /* Edge-trigger so a redundant CCCD write (same value + * twice) doesn't fire two SUBSCRIBED events. */ + if (sub != s_subscribed) { + s_subscribed = sub; + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_SUBSCRIBED, + .subscribed = { .subscribed = sub }, + }); + } } return 0; @@ -416,6 +685,65 @@ static int gap_event(struct ble_gap_event *event, void *arg) } } +/* ===== Pairing replies ================================================ */ + +/* Shared body for both reply APIs — looks at the pending state, builds + * the matching ble_sm_io payload, and injects it. `expected_action` is + * BLE_SM_IOACT_INPUT for passkey_reply and BLE_SM_IOACT_NUMCMP for + * compare_reply; calling the wrong API for the in-flight request + * returns ENOTCONN (treated as "no such request waiting"). */ +static int do_pairing_reply(uint8_t expected_action, + uint32_t passkey, + bool numcmp_accept) +{ + /* Snapshot the volatile fields once. The host task may clear them + * at any moment (disconnect / enc_change), and we want a coherent + * decision below. */ + uint16_t conn = s_pending_io_conn; + uint8_t action = s_pending_io_action; + if (conn == BLE_HS_CONN_HANDLE_NONE || action != expected_action) { + return BLE_UART_ENOTCONN; + } + + struct ble_sm_io io = { .action = expected_action }; + if (expected_action == BLE_SM_IOACT_INPUT) { + io.passkey = passkey; + } else { /* BLE_SM_IOACT_NUMCMP */ + io.numcmp_accept = numcmp_accept ? 1 : 0; + } + + /* Clear pending BEFORE inject so a re-entrant on_event triggered + * by inject_io doesn't see stale state. If inject fails the + * request is gone anyway (the SM will time out from the central's + * side), so leaving it cleared is the right move. */ + s_pending_io_conn = BLE_HS_CONN_HANDLE_NONE; + + int rc = ble_sm_inject_io(conn, &io); + if (rc != 0) { + ESP_LOGW(TAG, "ble_sm_inject_io(%s) rc=%d", + expected_action == BLE_SM_IOACT_INPUT ? "INPUT" : "NUMCMP", + rc); + /* ENOTCONN from NimBLE means the conn vanished between the + * snapshot and the inject — surface that to the caller as + * such; everything else is a stack-internal failure. */ + return (rc == BLE_HS_ENOTCONN) ? BLE_UART_ENOTCONN : BLE_UART_EFAIL; + } + return BLE_UART_OK; +} + +int ble_uart_passkey_reply(uint32_t passkey) +{ + if (passkey > 999999) { + return BLE_UART_EINVAL; + } + return do_pairing_reply(BLE_SM_IOACT_INPUT, passkey, false); +} + +int ble_uart_compare_reply(bool match) +{ + return do_pairing_reply(BLE_SM_IOACT_NUMCMP, 0, match); +} + /* ===== Host plumbing =================================================== */ static void on_reset(int reason) @@ -444,13 +772,112 @@ static void on_sync(void) static void nimble_host_task(void *param) { + (void)param; ESP_LOGI(TAG, "BLE host task started"); nimble_port_run(); - nimble_port_freertos_deinit(); + /* Self-delete instead of nimble_port_freertos_deinit(): do_close()'s + * nimble_port_stop() returns once port_run() exits in this task, but + * this task is still running. A quick ble_uart_open() may already have + * updated the port layer's host_task_h; freertos_deinit() would + * vTaskDelete(host_task_h) and kill the new host task. */ + vTaskDelete(NULL); } /* ===== Public lifecycle ================================================ */ +/* Resolved view of cfg.encrypted + the per-feature overrides + * (cfg.sc / cfg.bonding / cfg.mitm / cfg.io_cap). Used in install() + * to drive both ble_hs_cfg.sm_* and the GATT-table builder. */ +struct sec_policy { + bool sc; /* LE Secure Connections */ + bool bonding; /* persist LTK in NVS */ + bool mitm; /* require authentication */ + bool link_enc; /* derived: sc || bonding || mitm */ + uint8_t sm_io_cap; /* NimBLE BLE_HS_IO_* */ +}; + +static int resolve_sec_policy(const ble_uart_config_t *cfg, + struct sec_policy *out) +{ + const ble_uart_security_t *sec = &cfg->security; + + /* Range-check the public enums up front. Accepting (say) a + * dangling 99 here would propagate to ble_hs_cfg as garbage and + * the SM would refuse pairing for non-obvious reasons. */ + if ((unsigned)sec->sc > BLE_UART_SEC_ON + || (unsigned)sec->bonding > BLE_UART_SEC_ON + || (unsigned)sec->mitm > BLE_UART_SEC_ON + || (unsigned)sec->io_cap > BLE_UART_IO_CAP_KEYBOARD_DISPLAY) { + return BLE_UART_EINVAL; + } + + /* Input-capable IO caps fire BLE_UART_EVT_PASSKEY_REQUEST or + * BLE_UART_EVT_NUMERIC_COMPARE and need an application reply via + * ble_uart_passkey_reply / ble_uart_compare_reply. With on_event + * NULL the caller would never see the request and pairing would + * silently stall until the SM times out — fail synchronously. + * + * This checks the *configured* io_cap, not the value resolved + * below. AUTO and DISPLAY_ONLY are excluded on purpose: AUTO with + * mitm=ON becomes DisplayOnly; Passkey Display (BLE_SM_IOACT_DISP) + * is satisfied inside gap_event via ble_sm_inject_io with no app + * reply. BLE_UART_EVT_PASSKEY_DISPLAY is additive when on_event is + * set; with on_event NULL emit_evt() drops it and pairing still + * completes. */ + if (cfg->on_event == NULL + && (sec->io_cap == BLE_UART_IO_CAP_KEYBOARD_ONLY + || sec->io_cap == BLE_UART_IO_CAP_DISPLAY_YES_NO + || sec->io_cap == BLE_UART_IO_CAP_KEYBOARD_DISPLAY)) { + return BLE_UART_EINVAL; + } + + /* AUTO inherits the bit from cfg.encrypted; OFF / ON override. */ + bool preset = cfg->encrypted; + out->sc = (sec->sc == BLE_UART_SEC_AUTO) ? preset + : (sec->sc == BLE_UART_SEC_ON); + out->bonding = (sec->bonding == BLE_UART_SEC_AUTO) ? preset + : (sec->bonding == BLE_UART_SEC_ON); + out->mitm = (sec->mitm == BLE_UART_SEC_AUTO) ? preset + : (sec->mitm == BLE_UART_SEC_ON); + /* "Link will be encrypted" iff the SM runs at all — and the SM + * runs whenever any of these three bits is set. Pairing-without- + * bonding still encrypts the live link with a session LTK. */ + out->link_enc = out->sc || out->bonding || out->mitm; + + /* IO capability: AUTO picks the minimum that lets the resolved + * MITM bit succeed; the explicit values map straight to the + * NimBLE BLE_HS_IO_* constants used by the SM. */ + switch (sec->io_cap) { + case BLE_UART_IO_CAP_DISPLAY_ONLY: + out->sm_io_cap = BLE_HS_IO_DISPLAY_ONLY; + break; + case BLE_UART_IO_CAP_NO_INPUT_OUTPUT: + out->sm_io_cap = BLE_HS_IO_NO_INPUT_OUTPUT; + break; + case BLE_UART_IO_CAP_KEYBOARD_ONLY: + out->sm_io_cap = BLE_HS_IO_KEYBOARD_ONLY; + break; + case BLE_UART_IO_CAP_DISPLAY_YES_NO: + out->sm_io_cap = BLE_HS_IO_DISPLAY_YESNO; + break; + case BLE_UART_IO_CAP_KEYBOARD_DISPLAY: + out->sm_io_cap = BLE_HS_IO_KEYBOARD_DISPLAY; + break; + case BLE_UART_IO_CAP_AUTO: + default: + out->sm_io_cap = out->mitm ? BLE_HS_IO_DISPLAY_ONLY + : BLE_HS_IO_NO_INPUT_OUTPUT; + break; + } + + /* Just Works (NoInputNoOutput) cannot satisfy MITM — the SM + * would reject pairing in flight. Catch it synchronously here. */ + if (out->mitm && out->sm_io_cap == BLE_HS_IO_NO_INPUT_OUTPUT) { + return BLE_UART_EINVAL; + } + return BLE_UART_OK; +} + int ble_uart_install(const ble_uart_config_t *cfg) { if (s_installed) { @@ -464,11 +891,91 @@ int ble_uart_install(const ble_uart_config_t *cfg) memset(&s_cfg, 0, sizeof(s_cfg)); } + /* Validate device_name length up front. Beyond + * BLE_UART_DEVICE_NAME_MAX the default-path advertising would + * silently fail at adv_set_fields time; surfacing the error here + * is much friendlier. strnlen with cap+1 also stops a missing-NUL + * caller buffer from running into uninitialised memory. */ + if (s_cfg.device_name != NULL) { + size_t nlen = strnlen(s_cfg.device_name, BLE_UART_DEVICE_NAME_MAX + 1); + if (nlen > BLE_UART_DEVICE_NAME_MAX) { + ESP_LOGE(TAG, "device_name too long: > %u bytes", + (unsigned)BLE_UART_DEVICE_NAME_MAX); + memset(&s_cfg, 0, sizeof(s_cfg)); + return BLE_UART_EINVAL; + } + } + + /* Validate caller-supplied advertising payloads up front so an + * oversized buffer fails the install instead of corrupting the + * adv packet at start time (where errors only surface in logs). + * (NULL + len>0 is also rejected — almost always a caller bug.) */ + if (s_cfg.adv_data_len > BLE_UART_ADV_DATA_MAX + || (s_cfg.adv_data == NULL && s_cfg.adv_data_len > 0)) { + ESP_LOGE(TAG, "bad adv_data: ptr=%p len=%u (max=%u)", + s_cfg.adv_data, + (unsigned)s_cfg.adv_data_len, + (unsigned)BLE_UART_ADV_DATA_MAX); + memset(&s_cfg, 0, sizeof(s_cfg)); + return BLE_UART_EINVAL; + } + if (s_cfg.scan_rsp_data_len > BLE_UART_SCAN_RSP_DATA_MAX + || (s_cfg.scan_rsp_data == NULL && s_cfg.scan_rsp_data_len > 0)) { + ESP_LOGE(TAG, "bad scan_rsp_data: ptr=%p len=%u (max=%u)", + s_cfg.scan_rsp_data, + (unsigned)s_cfg.scan_rsp_data_len, + (unsigned)BLE_UART_SCAN_RSP_DATA_MAX); + memset(&s_cfg, 0, sizeof(s_cfg)); + return BLE_UART_EINVAL; + } + + /* Resolve cfg.encrypted + per-feature overrides into a flat + * policy. Validation (out-of-range enums + impossible MITM/IO + * combination) happens up front so install() rejects bad cfgs + * synchronously, before any host-stack resources are allocated. */ + struct sec_policy pol; + int srv = resolve_sec_policy(&s_cfg, &pol); + if (srv != BLE_UART_OK) { + ESP_LOGE(TAG, "bad security cfg: encrypted=%d sc=%d bonding=%d " + "mitm=%d io_cap=%d", + (int)s_cfg.encrypted, + (int)s_cfg.security.sc, (int)s_cfg.security.bonding, + (int)s_cfg.security.mitm, (int)s_cfg.security.io_cap); + memset(&s_cfg, 0, sizeof(s_cfg)); + return srv; + } + s_link_encrypted = pol.link_enc; + s_mitm_required = pol.mitm; + + /* Copy raw payloads now (caller's pointers may not outlive install). + * For adv_data we also prepend the 3-byte Flags AD ourselves — + * the controller-visible Flags element is library-controlled and + * not part of what the application owns. */ + s_adv_data_len = 0; + s_scan_rsp_data_len = 0; + if (s_cfg.adv_data != NULL && s_cfg.adv_data_len > 0) { + s_adv_data[0] = 0x02; /* AD length */ + s_adv_data[1] = 0x01; /* AD type: Flags */ + s_adv_data[2] = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP; + memcpy(s_adv_data + 3, s_cfg.adv_data, s_cfg.adv_data_len); + s_adv_data_len = (uint8_t)(3 + s_cfg.adv_data_len); + } + if (s_cfg.scan_rsp_data != NULL && s_cfg.scan_rsp_data_len > 0) { + memcpy(s_scan_rsp_data, s_cfg.scan_rsp_data, s_cfg.scan_rsp_data_len); + s_scan_rsp_data_len = (uint8_t)s_cfg.scan_rsp_data_len; + } + /* Drop the pointers — install must not retain caller buffers. */ + s_cfg.adv_data = NULL; + s_cfg.scan_rsp_data = NULL; + esp_err_t err = nimble_port_init(); if (err != ESP_OK) { ESP_LOGE(TAG, "nimble_port_init rc=%d", err); return BLE_UART_EFAIL; } +#if MYNEWT_VAL(BLE_HS_AUTO_START) + s_hs_auto_start_pending = true; +#endif /* From here every failure must `goto fail` so nimble_port_deinit() * runs — leaving the port allocated breaks the next install(). */ @@ -477,23 +984,27 @@ int ble_uart_install(const ble_uart_config_t *cfg) ble_hs_cfg.store_status_cb = ble_store_util_status_rr; ble_hs_cfg.gatts_register_cb = register_cb; - /* Encrypted = LE Secure Connections + Bonding + MITM, DisplayOnly. - * Plaintext = SM disabled. */ - if (s_cfg.encrypted) { - ble_hs_cfg.sm_io_cap = BLE_HS_IO_DISPLAY_ONLY; - ble_hs_cfg.sm_sc = 1; - ble_hs_cfg.sm_bonding = 1; - ble_hs_cfg.sm_mitm = 1; + /* Apply the resolved security policy. NimBLE checks sm_bonding + * before consulting the key-distribution masks, so it's safe to + * leave them set unconditionally — they're a no-op when bonding=0. */ + if (pol.link_enc) { + ble_hs_cfg.sm_io_cap = pol.sm_io_cap; + ble_hs_cfg.sm_sc = pol.sc ? 1 : 0; + ble_hs_cfg.sm_bonding = pol.bonding ? 1 : 0; + ble_hs_cfg.sm_mitm = pol.mitm ? 1 : 0; ble_hs_cfg.sm_our_key_dist = BLE_SM_PAIR_KEY_DIST_ENC | BLE_SM_PAIR_KEY_DIST_ID; ble_hs_cfg.sm_their_key_dist = BLE_SM_PAIR_KEY_DIST_ENC | BLE_SM_PAIR_KEY_DIST_ID; } else { + /* Fully plaintext: SM disabled, no keys exchanged. */ ble_hs_cfg.sm_io_cap = BLE_HS_IO_NO_INPUT_OUTPUT; ble_hs_cfg.sm_sc = 0; ble_hs_cfg.sm_bonding = 0; ble_hs_cfg.sm_mitm = 0; } +#if NIMBLE_BLE_CONNECT ble_svc_gap_init(); +#endif ble_svc_gatt_init(); /* Cache the device name into our own buffer (caller's pointer may @@ -517,23 +1028,26 @@ int ble_uart_install(const ble_uart_config_t *cfg) s_dev_name[0] = '\0'; } - build_gatt_table(s_cfg.encrypted); + rc = register_uart_gatt_svc(); + if (rc != BLE_UART_OK) { + goto fail; + } + s_gatts_needs_readd = false; - rc = ble_gatts_count_cfg(s_svc_defs); - if (rc != 0) { - ESP_LOGE(TAG, "ble_gatts_count_cfg rc=%d", rc); - goto fail; - } - rc = ble_gatts_add_svcs(s_svc_defs); - if (rc != 0) { - ESP_LOGE(TAG, "ble_gatts_add_svcs rc=%d", rc); - goto fail; - } + /* Wire up the NVS bond store (requires CONFIG_BT_NIMBLE_NVS_PERSIST=y). + * Done here — not in open() — so bond-management APIs + * (ble_uart_get_bond_count / clear_bonds / remove_peer) work + * between install and open, letting callers wipe stale bonds + * before the first advertising window opens. */ + ble_store_config_init(); s_installed = true; return BLE_UART_OK; fail: +#if MYNEWT_VAL(BLE_HS_AUTO_START) + s_hs_auto_start_pending = false; +#endif nimble_port_deinit(); memset(&s_cfg, 0, sizeof(s_cfg)); return xlate_rc(rc); @@ -550,16 +1064,40 @@ int ble_uart_open(void) return BLE_UART_EALREADY; } - /* NVS bond store (requires CONFIG_BT_NIMBLE_NVS_PERSIST=y). */ - ble_store_config_init(); + if (s_gatts_needs_readd) { + int grc = reregister_gatt_svcs_after_close(); + if (grc != BLE_UART_OK) { + return grc; + } + s_gatts_needs_readd = false; + } - /* Spawn host task; on_sync starts advertising once controller is ready. */ + /* Spawn host task, then queue host start. on_sync() starts advertising + * once the controller sync completes. + * + * With BLE_HS_AUTO_START (default), install()'s nimble_port_init() + * already queued a one-shot start event — open() must not sched_start() + * again or ble_hs_start() returns BLE_HS_EALREADY and the host task + * asserts. After close()'s nimble_port_stop() the host is OFF and no + * AUTO_START event remains, so every later open() must sched_start(). */ nimble_port_freertos_init(nimble_host_task); +#if MYNEWT_VAL(BLE_HS_AUTO_START) + if (!s_hs_auto_start_pending) { + ble_hs_sched_start(); + } + s_hs_auto_start_pending = false; +#else + ble_hs_sched_start(); +#endif s_opened = true; return BLE_UART_OK; } -int ble_uart_close(void) +/* Body of ble_uart_close(); also called directly by the close-async + * worker, which has already latched s_closing itself. The public + * wrapper below uses s_closing to reject a sync close that races + * with an in-flight async close. */ +static int do_close(void) { if (!s_opened) { return BLE_UART_EALREADY; @@ -568,9 +1106,16 @@ int ble_uart_close(void) /* Latch first so GAP events stop re-arming advertising. */ s_shutting_down = true; - int rc = ble_gap_adv_stop(); - if (rc != 0 && rc != BLE_HS_EALREADY) { - ESP_LOGW(TAG, "adv_stop rc=%d", rc); + /* Only stop adv if it's still running. Undirected adv auto-stops + * at the LL on connect, so calling adv_stop while connected just + * burns one HCI cmd that NimBLE answers with BLE_HS_EALREADY. + * Mirrors the Bluedroid backend's `if (s_adv_active)` gate. */ + int rc = 0; + if (ble_gap_adv_active()) { + rc = ble_gap_adv_stop(); + if (rc != 0 && rc != BLE_HS_EALREADY) { + ESP_LOGW(TAG, "adv_stop rc=%d", rc); + } } /* Graceful disconnect: wait up to 500 ms for the disconnect event @@ -588,8 +1133,8 @@ int ble_uart_close(void) } } - /* nimble_host_task self-cleans (port_freertos_deinit + delete) when - * port_run returns, so no explicit join. */ + /* nimble_port_stop() waits for port_run() to exit in the host task; + * the host then vTaskDelete(NULL) — no join after stop returns. */ rc = nimble_port_stop(); if (rc != 0) { ESP_LOGE(TAG, "nimble_port_stop rc=%d", rc); @@ -597,6 +1142,16 @@ int ble_uart_close(void) return BLE_UART_EFAIL; } + /* Host stop frees the svc-def pointer array; stale ATT rows can remain + * until cleared. Use the public ble_gatts_reset() only (no NimBLE + * source edits) and re-queue svc defs on the next open(). */ + rc = ble_gatts_reset(); + if (rc != 0) { + ESP_LOGW(TAG, "ble_gatts_reset rc=%d", rc); + } + s_tx_val_handle = 0; + s_gatts_needs_readd = true; + s_conn_handle = BLE_HS_CONN_HANDLE_NONE; s_subscribed = false; s_opened = false; @@ -604,12 +1159,237 @@ int ble_uart_close(void) return BLE_UART_OK; } +int ble_uart_close(void) +{ + /* If a ble_uart_close_async() worker is in flight, the close + * sequence is already running on the worker's task — let it + * finish rather than racing it from here. The worker drives + * s_opened to false on its own, so the next sync close after + * the worker drains will get the natural !s_opened EALREADY. */ + if (s_closing) { + return BLE_UART_EALREADY; + } + return do_close(); +} + +/* ===== Async close ==================================================== */ + +/* Background worker spawned by ble_uart_close_async(). Lives just + * long enough to run the synchronous close path (which itself can + * block on the disconnect timeout and on nimble_port_stop()), then + * fires the completion event and self-deletes. + * + * Spawned as a separate task — not a deferred ble_npl callout — so + * that nimble_port_stop() can join the host task without us being + * the host task. */ +static void close_async_task(void *arg) +{ + (void)arg; + + /* Bypass the s_closing gate in ble_uart_close(): we ARE the + * in-flight async close that gate is meant to protect against. */ + int rc = do_close(); + if (rc != BLE_UART_OK && rc != BLE_UART_EALREADY) { + ESP_LOGW(TAG, "close_async: do_close rc=%d", rc); + } + + /* Deliver CLOSED on the worker task. Applications must defer + * ble_uart_uninstall() to another task (PORTING.md §5.3.2). + * Concurrent uninstall() may clear s_cfg while we read on_event. */ + emit_evt(&(ble_uart_evt_t){ + .id = BLE_UART_EVT_CLOSED, + .closed = { .status = rc }, + }); + + s_closing = false; + vTaskDelete(NULL); +} + +int ble_uart_close_async(void) +{ + /* Same-state checks as the synchronous variant: nothing to close + * if we never opened, and no point spawning a second worker if + * the first hasn't drained yet. */ + if (!s_opened || s_closing) { + return BLE_UART_EALREADY; + } + + /* Latch BEFORE spawning so a racing caller (different task) sees + * the in-flight state immediately and gets EALREADY. */ + s_closing = true; + + /* 3 KB is comfortably more than the close path uses (mostly small + * GAP/HCI helpers + a 50×10ms vTaskDelay loop); bump if you wedge + * a heavy on_event handler between adv_stop and CLOSED. */ + BaseType_t ok = xTaskCreate(close_async_task, "ble_close", + 3072, NULL, + tskIDLE_PRIORITY + 2, NULL); + if (ok != pdPASS) { + s_closing = false; + return BLE_UART_ENOMEM; + } + return BLE_UART_OK; +} + +/* ===== Bond management ================================================ */ + +/* Public API uses big-endian bytes (bytes[0] = MSB) but NimBLE stores + * addresses little-endian (val[0] = LSB). Caller must supply + * BLE_UART_ADDR_TYPE_PUBLIC/RANDOM (0/1); the bond store keys on + * those same identity types. */ +static void to_nimble_addr(const ble_uart_addr_t *src, ble_addr_t *dst) +{ + dst->type = src->type; + for (int i = 0; i < 6; i++) { + dst->val[i] = src->bytes[5 - i]; + } +} + +#if MYNEWT_VAL(BLE_STORE_MAX_BONDS) > 0 +/* ble_store_util_bonded_peers enumerates OUR_SEC (unique peer_addr). + * Heap-allocate the scratch buffer so callers on small-stack tasks are + * safe regardless of CONFIG_BT_NIMBLE_MAX_BONDS. */ +static int bonded_peers_unique_count(size_t *out_count) +{ + const int max_peers = MYNEWT_VAL(BLE_STORE_MAX_BONDS); + ble_addr_t *peer_addrs = calloc((size_t)max_peers, sizeof(*peer_addrs)); + if (peer_addrs == NULL) { + return BLE_UART_ENOMEM; + } + int num_peers = 0; + int rc = ble_store_util_bonded_peers(peer_addrs, &num_peers, max_peers); + free(peer_addrs); + if (rc != 0) { + ESP_LOGW(TAG, "ble_store_util_bonded_peers rc=%d", rc); + return xlate_rc(rc); + } + *out_count = (size_t)num_peers; + return BLE_UART_OK; +} +#endif + +int ble_uart_get_bond_count(size_t *out_count) +{ + if (out_count == NULL || !s_installed) { + return BLE_UART_EINVAL; + } +#if MYNEWT_VAL(BLE_STORE_MAX_BONDS) > 0 + return bonded_peers_unique_count(out_count); +#else + *out_count = 0; + return BLE_UART_OK; +#endif +} + +int ble_uart_get_bonded_peers(ble_uart_addr_t *out, size_t cap, size_t *out_count) +{ + if (out_count == NULL || !s_installed + || (out == NULL && cap > 0)) { + return BLE_UART_EINVAL; + } + +#if MYNEWT_VAL(BLE_STORE_MAX_BONDS) <= 0 + *out_count = 0; + return BLE_UART_OK; +#else + /* ble_store_util_bonded_peers enumerates OUR_SEC (unique peer_addr). + * Size the buffer to BLE_STORE_MAX_BONDS — the compile-time cap — + * not PEER_SEC/OUR_SEC raw entry counts (they can disagree). */ + const int max_peers = MYNEWT_VAL(BLE_STORE_MAX_BONDS); + + if (cap == 0) { + return bonded_peers_unique_count(out_count); + } + + int n_our = 0; + int rc = ble_store_util_count(BLE_STORE_OBJ_TYPE_OUR_SEC, &n_our); + if (rc != 0) { + ESP_LOGW(TAG, "ble_store_util_count rc=%d", rc); + return xlate_rc(rc); + } + if (n_our <= 0) { + *out_count = 0; + return BLE_UART_OK; + } + + /* Bonded peers in NimBLE's native LE byte order. Heap-allocate to + * keep the host task's stack untouched even when many peers exist. */ + ble_addr_t *tmp = calloc((size_t)max_peers, sizeof(*tmp)); + if (tmp == NULL) { + return BLE_UART_ENOMEM; + } + int got = 0; + rc = ble_store_util_bonded_peers(tmp, &got, max_peers); + if (rc != 0) { + ESP_LOGW(TAG, "ble_store_util_bonded_peers rc=%d", rc); + free(tmp); + return xlate_rc(rc); + } + + /* Copy at most cap entries into the caller's buffer, flipping + * NimBLE's LE byte order back to our public big-endian convention + * and narrowing addr types to BLE_UART_ADDR_TYPE_* . */ + size_t to_copy = ((size_t)got < cap) ? (size_t)got : cap; + for (size_t i = 0; i < to_copy; i++) { + from_nimble_addr(&tmp[i], &out[i]); + } + free(tmp); + *out_count = (size_t)got; + return BLE_UART_OK; +#endif +} + +int ble_uart_remove_peer(const ble_uart_addr_t *peer) +{ + if (peer == NULL || !s_installed) { + return BLE_UART_EINVAL; + } + ble_addr_t addr; + to_nimble_addr(peer, &addr); + int rc = ble_store_util_delete_peer(&addr); + if (rc != 0) { + ESP_LOGW(TAG, "ble_store_util_delete_peer rc=%d", rc); + return xlate_rc(rc); + } + return BLE_UART_OK; +} + +int ble_uart_clear_bonds(void) +{ + if (!s_installed) { + return BLE_UART_EINVAL; + } + /* Wipes peer LTK + our LTK + persisted CCCD (and a few NimBLE + * internal records). Doesn't touch our s_cfg or any other NVS + * namespace. */ + int rc = ble_store_clear(); + if (rc != 0) { + ESP_LOGW(TAG, "ble_store_clear rc=%d", rc); + return xlate_rc(rc); + } + return BLE_UART_OK; +} + +/* ===== Uninstall ====================================================== */ + int ble_uart_uninstall(void) { if (!s_installed) { return BLE_UART_EALREADY; } + /* If a ble_uart_close_async() worker is still draining, poll s_closing + * for up to ~5 s before touching shared state. On timeout, teardown + * continues anyway — applications must follow PORTING.md §5.3.2 so + * uninstall runs only after the worker has finished. */ + for (int i = 0; i < 500 && s_closing; i++) { + vTaskDelay(pdMS_TO_TICKS(10)); + } + if (s_closing) { + ESP_LOGW(TAG, "uninstall: close_async worker still running, " + "tearing down anyway"); + } + /* Best-effort cleanup. Do NOT early-return on a per-step failure: * leaving s_installed=true with partially torn-down NimBLE state * makes the module unrecoverable (can't re-install, can't retry @@ -639,14 +1419,25 @@ int ble_uart_uninstall(void) } memset(&s_cfg, 0, sizeof(s_cfg)); - s_dev_name[0] = '\0'; - s_tx_val_handle = 0; - s_conn_handle = BLE_HS_CONN_HANDLE_NONE; - s_subscribed = false; - s_own_addr_type = 0; - s_shutting_down = false; - s_installed = false; - s_opened = false; + s_dev_name[0] = '\0'; + s_tx_val_handle = 0; + s_conn_handle = BLE_HS_CONN_HANDLE_NONE; + s_subscribed = false; + s_own_addr_type = 0; + s_shutting_down = false; + s_closing = false; + s_installed = false; + s_opened = false; + s_gatts_needs_readd = false; +#if MYNEWT_VAL(BLE_HS_AUTO_START) + s_hs_auto_start_pending = false; +#endif + s_adv_data_len = 0; + s_scan_rsp_data_len = 0; + s_link_encrypted = false; + s_mitm_required = false; + s_pending_io_conn = BLE_HS_CONN_HANDLE_NONE; + s_pending_io_action = 0; return first_rc; }