From bd65300bb7ce2d44dc7326399b9be65778be5376 Mon Sep 17 00:00:00 2001 From: Szymon Janc Date: Fri, 18 May 2018 14:37:50 +0200 Subject: [PATCH] docs: Move from mynewt-core --- docs/.gitignore | 6 + docs/Makefile | 25 ++ docs/README.rst | 35 ++ docs/ble_hs/ble_att.rst | 22 + docs/ble_hs/ble_gap.rst | 14 + docs/ble_hs/ble_gattc.rst | 15 + docs/ble_hs/ble_gatts.rst | 15 + docs/ble_hs/ble_hs.rst | 27 ++ docs/ble_hs/ble_hs_id.rst | 45 ++ docs/ble_hs/ble_hs_return_codes.rst | 437 ++++++++++++++++++ docs/ble_intro.rst | 122 +++++ docs/ble_sec.rst | 76 ++++ docs/ble_setup/ble_addr.rst | 63 +++ docs/ble_setup/ble_lp_clock.rst | 67 +++ docs/ble_setup/ble_setup_intro.rst | 13 + docs/ble_setup/ble_sync_cb.rst | 80 ++++ docs/btshell/btshell_GAP.rst | 660 ++++++++++++++++++++++++++++ docs/btshell/btshell_GATT.rst | 108 +++++ docs/btshell/btshell_advdata.rst | 47 ++ docs/btshell/btshell_api.rst | 153 +++++++ docs/conf.py | 177 ++++++++ docs/mesh/index.rst | 95 ++++ docs/mesh/mesh_lightning_model.jpg | Bin 0 -> 120157 bytes docs/mesh/mesh_topology.jpg | Bin 0 -> 120443 bytes docs/mesh/sample.rst | 30 ++ 25 files changed, 2332 insertions(+) create mode 100644 docs/.gitignore create mode 100644 docs/Makefile create mode 100644 docs/README.rst create mode 100644 docs/ble_hs/ble_att.rst create mode 100644 docs/ble_hs/ble_gap.rst create mode 100644 docs/ble_hs/ble_gattc.rst create mode 100644 docs/ble_hs/ble_gatts.rst create mode 100644 docs/ble_hs/ble_hs.rst create mode 100644 docs/ble_hs/ble_hs_id.rst create mode 100644 docs/ble_hs/ble_hs_return_codes.rst create mode 100644 docs/ble_intro.rst create mode 100644 docs/ble_sec.rst create mode 100644 docs/ble_setup/ble_addr.rst create mode 100644 docs/ble_setup/ble_lp_clock.rst create mode 100644 docs/ble_setup/ble_setup_intro.rst create mode 100644 docs/ble_setup/ble_sync_cb.rst create mode 100644 docs/btshell/btshell_GAP.rst create mode 100644 docs/btshell/btshell_GATT.rst create mode 100644 docs/btshell/btshell_advdata.rst create mode 100644 docs/btshell/btshell_api.rst create mode 100644 docs/conf.py create mode 100644 docs/mesh/index.rst create mode 100644 docs/mesh/mesh_lightning_model.jpg create mode 100644 docs/mesh/mesh_topology.jpg create mode 100644 docs/mesh/sample.rst diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..4be501a05 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,6 @@ +xml +node_modules +_build +doxygen_* +*.pyc +.doctrees diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 000000000..9c8793a16 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,25 @@ +# Make a preview site for Sphinx & Doxygen output + +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = Mynewt +SOURCEDIR = . +BUILDDIR = _build/sphinx + +.PHONY: Makefile clean preview doxygen + +clean: + rm -rf _build + +preview: _build doxygen sphinx + +_build: + mkdir -p _build + +doxygen: + mkdir -p _build/html + cd .. && doxygen docs/doxygen.xml + +sphinx: + sphinx-build . _build/sphinx + mv _build/sphinx _build/html/documentation diff --git a/docs/README.rst b/docs/README.rst new file mode 100644 index 000000000..d7b3908a3 --- /dev/null +++ b/docs/README.rst @@ -0,0 +1,35 @@ +Mynewt Documentation +#################### + +This folder holds the documentation for the core OS of the +`Apache Mynewt`_ project. It is built using `Sphinx`_. +The source code also contains inline comments in `Doxygen`_ +format to document the APIs. + +The complete project documentation can be found at `mynewt documentation`_ + +.. contents:: + +Writing Documentation +======================= + +See: https://github.com/apache/mynewt-documentation#writing-documentation + +Previewing Changes +========================== + +In order to preview any changes you make you must first install a Sphinx/Breathe/Doxygen toolchain as +described at https://github.com/apache/mynewt-documentation#id3. Then: + +.. code-block:: bash + + $ cd docs + $ make clean && make preview && (cd _build/html && python -m SimpleHTTPServer 8080) + + + +.. _Apache Mynewt: https://mynewt.apache.org/ +.. _mynewt documentation: https://github.com/apache/mynewt-documentation +.. _Sphinx: http://www.sphinx-doc.org/ +.. _Doxygen: http://www.doxygen.org/ +.. _Breathe: http://breathe.readthedocs.io/en/latest/ diff --git a/docs/ble_hs/ble_att.rst b/docs/ble_hs/ble_att.rst new file mode 100644 index 000000000..f4b5074ea --- /dev/null +++ b/docs/ble_hs/ble_att.rst @@ -0,0 +1,22 @@ +NimBLE Host ATT Client Reference +-------------------------------- + +Introduction +~~~~~~~~~~~~ + +The Attribute Protocol (ATT) is a mid-level protocol that all BLE devices use to exchange data. Data is exchanged when +an ATT client reads or writes an attribute belonging to an ATT server. Any device that needs to send or receive data +must support both the client and server functionality of the ATT protocol. The only devices which do not support ATT +are the most basic ones: broadcasters and observers (i.e., beaconing devices and listening devices). + +Most ATT functionality is not interesting to an application. Rather than use ATT directly, an application uses the +higher level GATT profile, which sits directly above ATT in the host. NimBLE exposes the few bits of ATT functionality +which are not encompassed by higher level GATT functions. This section documents the ATT functionality that the NimBLE +host exposes to the application. + +Header +~~~~~~ + +.. code-block:: cpp + + #include "host/ble_hs.h" diff --git a/docs/ble_hs/ble_gap.rst b/docs/ble_hs/ble_gap.rst new file mode 100644 index 000000000..4daeef81f --- /dev/null +++ b/docs/ble_hs/ble_gap.rst @@ -0,0 +1,14 @@ +NimBLE Host GAP Reference +------------------------- + +Introduction +~~~~~~~~~~~~ + +The Generic Access Profile (GAP) is responsible for all connecting, advertising, scanning, and connection updating operations. + +Header +~~~~~~ + +.. code-block:: cpp + + #include "host/ble_hs.h" diff --git a/docs/ble_hs/ble_gattc.rst b/docs/ble_hs/ble_gattc.rst new file mode 100644 index 000000000..3ed1fc0ad --- /dev/null +++ b/docs/ble_hs/ble_gattc.rst @@ -0,0 +1,15 @@ +NimBLE Host GATT Client Reference +--------------------------------- + +Introduction +~~~~~~~~~~~~ + +The Generic Attribute Profile (GATT) manages all activities involving services, characteristics, and descriptors. The +client half of the GATT API initiates GATT procedures. + +Header +~~~~~~ + +.. code-block:: cpp + + #include "host/ble_hs.h" diff --git a/docs/ble_hs/ble_gatts.rst b/docs/ble_hs/ble_gatts.rst new file mode 100644 index 000000000..871ea831a --- /dev/null +++ b/docs/ble_hs/ble_gatts.rst @@ -0,0 +1,15 @@ +NimBLE Host GATT Server Reference +--------------------------------- + +Introduction +~~~~~~~~~~~~ + +The Generic Attribute Profile (GATT) manages all activities involving services, characteristics, and descriptors. The +server half of the GATT API handles registration and responding to GATT clients. + +Header +~~~~~~ + +.. code-block:: cpp + + #include "host/ble_hs.h" diff --git a/docs/ble_hs/ble_hs.rst b/docs/ble_hs/ble_hs.rst new file mode 100644 index 000000000..4de5a6495 --- /dev/null +++ b/docs/ble_hs/ble_hs.rst @@ -0,0 +1,27 @@ +NimBLE Host +----------- + +Introduction +~~~~~~~~~~~~ + +At a high level, the NimBLE stack is divided into two components: + +- Host +- Controller + +This document is an API reference for the host component. If you are +interested in the general structure of the NimBLE stack and its non-host +components, you might want to read the :doc:`../ble_intro`. + +The host sits directly below the application, and it serves as the +interface to the application for all BLE operations. + +.. toctree:: + :titlesonly: + + Return Codes + GAP + GATT Client + GATT Server + Identity + ATT diff --git a/docs/ble_hs/ble_hs_id.rst b/docs/ble_hs/ble_hs_id.rst new file mode 100644 index 000000000..dbb47c941 --- /dev/null +++ b/docs/ble_hs/ble_hs_id.rst @@ -0,0 +1,45 @@ +NimBLE Host Identity Reference +------------------------------ + +Introduction +~~~~~~~~~~~~ + +The identity API provides facilities for querying and configuring your device's addresses. BLE's addressing scheme is +quite involved; the summary that follows is only a brief introduction. + +BLE defines four address types: + ++---------------------------------+---------------------------------------------------------------------------------------------------+-------------+----------------------------------------------+ +| Type | Description | Identity? | Configured with | ++=================================+===================================================================================================+=============+==============================================+ +| Public | Address assigned by manufacturer; the three most significant bytes form the manufacturer's OUI. | Yes | N/A; read from controller at startup. | ++---------------------------------+---------------------------------------------------------------------------------------------------+-------------+----------------------------------------------+ +| Static random | Randomly generated address. | Yes | *ble_hs_id_set_rnd()* | ++---------------------------------+---------------------------------------------------------------------------------------------------+-------------+----------------------------------------------+ +| Resolvable private (RPA) | Address randomly generated from an identity address and an identity resolving key (IRK). | No | N/A; generated by controller periodically. | ++---------------------------------+---------------------------------------------------------------------------------------------------+-------------+----------------------------------------------+ +| Non-resolvable private (NRPA) | Randomly generated address. | No | *ble_hs_id_set_rnd()* | ++---------------------------------+---------------------------------------------------------------------------------------------------+-------------+----------------------------------------------+ + +Identity Addresses +^^^^^^^^^^^^^^^^^^ + +The third column in the above table indicates the *identity* property of each address type. An identity address never +changes, and a device can be identified by one of its unique identity addresses. + +Non-identity addresses are used by devices supporting BLE privacy. A device using the privacy feature frequently changes +its own address to a newly-generated non-identity address. By cycling its address, the device makes it impossible for +eavesdroppers to track its location. + +A device can have up to two identity addresses at once: one public and one static random. As indicated in the above table, +the public identity address cannot be configured; the static random identity address can be set by calling *ble_hs_id_set_rnd()*. + +The address type is selected on a per-GAP-procedure basis. Each time you initiate a GAP procedure, you indicate which +address type the device should use for the duration of the procedure. + +Header +~~~~~~ + +.. code-block:: cpp + + #include "host/ble_hs.h" diff --git a/docs/ble_hs/ble_hs_return_codes.rst b/docs/ble_hs/ble_hs_return_codes.rst new file mode 100644 index 000000000..c69cc4f8d --- /dev/null +++ b/docs/ble_hs/ble_hs_return_codes.rst @@ -0,0 +1,437 @@ +NimBLE Host Return Codes +------------------------ + +.. contents:: + :local: + :depth: 2 + +Introduction +~~~~~~~~~~~~ + +Summary +^^^^^^^ + +The NimBLE host reports status to the application via a set of return codes. The host encompasses several layers of the Bluetooth specification that each defines its own set of status codes. Rather than "abstract away" information from lower layers that the application developer might find useful, the NimBLE host aims to indicate precisely what happened when something fails. Consequently, the host utilizes a rather large set of return codes. + +A return code of 0 indicates success. For failure conditions, the return codes are partitioned into five separate sets: + ++---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Set | Condition | ++===========================+=============================================================================================================================================================================================================+ +| Core | Errors detected internally by the NimBLE host. | ++---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ATT | The ATT server has reported a failure via the transmission of an ATT Error Response. The return code corresponds to the value of the Error Code field in the response. | ++---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| HCI | The controller has reported an error to the host via a command complete or command status HCI event. The return code corresponds to the value of the Status field in the event. | ++---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| L2CAP | An L2CAP signaling procedure has failed and an L2CAP Command Reject was sent as a result. The return code corresponds to the value of the Reason field in the command. | ++---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Security manager (us) | The host detected an error during a security manager procedure and sent a Pairing Failed command to the peer. The return code corresponds to the value of the Reason field in the Pairing Failed command. | ++---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Security manager (peer) | A security manager procedure failed because the peer sent us a Pairing Failed command. The return code corresponds to the value of the Reason field in the Pairing Failed command. | ++---------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +The return codes in the core set are defined by the NimBLE Host. The other sets are defined in the Bluetooth specification; the codes in this latter group are referred to as *formal status codes*. As defined in the Bluetooth specification, the formal status code sets are not disjoint. That is, they overlap. For example, the spec defines a status code of 1 to have all of the following meanings: + ++---------+----------------------------+ +| Layer | Meaning | ++=========+============================+ +| ATT | Invalid handle. | ++---------+----------------------------+ +| HCI | Unknown HCI command. | ++---------+----------------------------+ +| L2CAP | Signalling MTU exceeded. | ++---------+----------------------------+ +| SM | Passkey entry failed. | ++---------+----------------------------+ + +Clearly, the host can't just return an unadorned formal status code and expect the application to make sense of it. To resolve this ambiguity, the NimBLE host divides the full range of an int into several subranges. Each subrange corresponds to one of the five return code sets. For example, the ATT set is mapped onto the subrange *[0x100, 0x200)*. To indicate an ATT error of 3 (write not permitted), the NimBLE host returns a value 0x103 to the application. + +The host defines a set of convenience macros for converting from a formal status code to NimBLE host status code. These macros are documented in the table below. + ++----------------------------+---------------------------+--------------+ +| Macro | Status code set | Base value | ++============================+===========================+==============+ +| BLE\_HS\_ATT\_ERR() | ATT | 0x100 | ++----------------------------+---------------------------+--------------+ +| BLE\_HS\_HCI\_ERR() | HCI | 0x200 | ++----------------------------+---------------------------+--------------+ +| BLE\_HS\_L2C\_ERR() | L2CAP | 0x300 | ++----------------------------+---------------------------+--------------+ +| BLE\_HS\_SM\_US\_ERR() | Security manager (us) | 0x400 | ++----------------------------+---------------------------+--------------+ +| BLE\_HS\_SM\_PEER\_ERR() | Security manager (peer) | 0x500 | ++----------------------------+---------------------------+--------------+ + +Example +^^^^^^^ + +The following example demonstrates how an application might determine which error is being reported by the host. In this example, the application performs the GAP encryption procedure and checks the return code. To simplify the example, the application uses a hypothetical *my\_blocking\_enc\_proc()* function, which blocks until the pairing operation has completed. + +.. code:: c + + void + encrypt_connection(uint16_t conn_handle) + { + int rc; + + /* Perform a blocking GAP encryption procedure. */ + rc = my_blocking_enc_proc(conn_handle); + switch (rc) { + case 0: + console_printf("success - link successfully encrypted\n"); + break; + + case BLE_HS_ENOTCONN: + console_printf("failure - no connection with handle %d\n", + conn_handle); + break; + + case BLE_HS_ERR_SM_US_BASE(BLE_SM_ERR_CONFIRM_MISMATCH): + console_printf("failure - mismatch in peer's confirm and random " + "commands.\n"); + break; + + case BLE_HS_ERR_SM_PEER_BASE(BLE_SM_ERR_CONFIRM_MISMATCH): + console_printf("failure - peer reports mismatch in our confirm and " + "random commands.\n"); + break; + + default: + console_printf("failure - other error: 0x%04x\n", rc); + break; + } + } + +Return Code Reference +~~~~~~~~~~~~~~~~~~~~~ + +Header +^^^^^^ + +All NimBLE host return codes are made accessible by including the following header: + +.. code:: c + + #include "host/ble_hs.h" + +Return codes - Core +^^^^^^^^^^^^^^^^^^^ + +The precise meaning of each of these error codes depends on the function that returns it. +The API reference for a particular function indicates the conditions under which each of these codes are returned. + ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| Value | Name | Condition | ++=========+==============================+=============================================================================================+ +| 0x00 | *N/A* | Success | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x01 | BLE\_HS\_EAGAIN | Temporary failure; try again. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x02 | BLE\_HS\_EALREADY | Operation already in progress or completed. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x03 | BLE\_HS\_EINVAL | One or more arguments are invalid. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x04 | BLE\_HS\_EMSGSIZE | The provided buffer is too small. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x05 | BLE\_HS\_ENOENT | No entry matching the specified criteria. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x06 | BLE\_HS\_ENOMEM | Operation failed due to resource exhaustion. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x07 | BLE\_HS\_ENOTCONN | No open connection with the specified handle. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x08 | BLE\_HS\_ENOTSUP | Operation disabled at compile time. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x09 | BLE\_HS\_EAPP | Application callback behaved unexpectedly. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x0a | BLE\_HS\_EBADDATA | Command from peer is invalid. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x0b | BLE\_HS\_EOS | Mynewt OS error. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x0c | BLE\_HS\_ECONTROLLER | Event from controller is invalid. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x0d | BLE\_HS\_ETIMEOUT | Operation timed out. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x0e | BLE\_HS\_EDONE | Operation completed successfully. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x0f | BLE\_HS\_EBUSY | Operation cannot be performed until procedure completes. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x10 | BLE\_HS\_EREJECT | Peer rejected a connection parameter update request. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x11 | BLE\_HS\_EUNKNOWN | Unexpected failure; catch all. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x12 | BLE\_HS\_EROLE | Operation requires different role (e.g., central vs. peripheral). | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x13 | BLE\_HS\_ETIMEOUT\_HCI | HCI request timed out; controller unresponsive. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x14 | BLE\_HS\_ENOMEM\_EVT | Controller failed to send event due to memory exhaustion (combined host-controller only). | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x15 | BLE\_HS\_ENOADDR | Operation requires an identity address but none configured. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x16 | BLE\_HS\_ENOTSYNCED | Attempt to use the host before it is synced with controller. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x17 | BLE\_HS\_EAUTHEN | Insufficient authentication. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x18 | BLE\_HS\_EAUTHOR | Insufficient authorization. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x19 | BLE\_HS\_EENCRYPT | Insufficient encryption level. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x1a | BLE\_HS\_EENCRYPT\_KEY\_SZ | Insufficient key size. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x1b | BLE\_HS\_ESTORE\_CAP | Storage at capacity. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ +| 0x1c | BLE\_HS\_ESTORE\_FAIL | Storage IO error. | ++---------+------------------------------+---------------------------------------------------------------------------------------------+ + +Return codes - ATT +^^^^^^^^^^^^^^^^^^ + ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| NimBLE Value | Formal Value | Name | Condition | ++================+================+============================================+===========================================================================================================================================+ +| 0x0101 | 0x01 | BLE\_ATT\_ERR\_INVALID\_HANDLE | The attribute handle given was not valid on this server. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0102 | 0x02 | BLE\_ATT\_ERR\_READ\_NOT\_PERMITTED | The attribute cannot be read. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0103 | 0x03 | BLE\_ATT\_ERR\_WRITE\_NOT\_PERMITTED | The attribute cannot be written. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0104 | 0x04 | BLE\_ATT\_ERR\_INVALID\_PDU | The attribute PDU was invalid. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0105 | 0x05 | BLE\_ATT\_ERR\_INSUFFICIENT\_AUTHEN | The attribute requires authentication before it can be read or written. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0106 | 0x06 | BLE\_ATT\_ERR\_REQ\_NOT\_SUPPORTED | Attribute server does not support the request received from the client. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0107 | 0x07 | BLE\_ATT\_ERR\_INVALID\_OFFSET | Offset specified was past the end of the attribute. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0108 | 0x08 | BLE\_ATT\_ERR\_INSUFFICIENT\_AUTHOR | The attribute requires authorization before it can be read or written. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0109 | 0x09 | BLE\_ATT\_ERR\_PREPARE\_QUEUE\_FULL | Too many prepare writes have been queued. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x010a | 0x0a | BLE\_ATT\_ERR\_ATTR\_NOT\_FOUND | No attribute found within the given attribute handle range. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x010b | 0x0b | BLE\_ATT\_ERR\_ATTR\_NOT\_LONG | The attribute cannot be read or written using the Read Blob Request. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x010c | 0x0c | BLE\_ATT\_ERR\_INSUFFICIENT\_KEY\_SZ | The Encryption Key Size used for encrypting this link is insufficient. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x010d | 0x0d | BLE\_ATT\_ERR\_INVALID\_ATTR\_VALUE\_LEN | The attribute value length is invalid for the operation. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x010e | 0x0e | BLE\_ATT\_ERR\_UNLIKELY | The attribute request that was requested has encountered an error that was unlikely, and therefore could not be completed as requested. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x010f | 0x0f | BLE\_ATT\_ERR\_INSUFFICIENT\_ENC | The attribute requires encryption before it can be read or written. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0110 | 0x10 | BLE\_ATT\_ERR\_UNSUPPORTED\_GROUP | The attribute type is not a supported grouping attribute as defined by a higher layer specification. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0111 | 0x11 | BLE\_ATT\_ERR\_INSUFFICIENT\_RES | Insufficient Resources to complete the request. | ++----------------+----------------+--------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ + +Return codes - HCI +^^^^^^^^^^^^^^^^^^ + ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| NimBLE Value | Formal Value | Name | Condition | ++================+================+====================================+================================================================================+ +| 0x0201 | 0x01 | BLE\_ERR\_UNKNOWN\_HCI\_CMD | Unknown HCI Command | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0202 | 0x02 | BLE\_ERR\_UNK\_CONN\_ID | Unknown Connection Identifier | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0203 | 0x03 | BLE\_ERR\_HW\_FAIL | Hardware Failure | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0204 | 0x04 | BLE\_ERR\_PAGE\_TMO | Page Timeout | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0205 | 0x05 | BLE\_ERR\_AUTH\_FAIL | Authentication Failure | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0206 | 0x06 | BLE\_ERR\_PINKEY\_MISSING | PIN or Key Missing | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0207 | 0x07 | BLE\_ERR\_MEM\_CAPACITY | Memory Capacity Exceeded | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0208 | 0x08 | BLE\_ERR\_CONN\_SPVN\_TMO | Connection Timeout | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0209 | 0x09 | BLE\_ERR\_CONN\_LIMIT | Connection Limit Exceeded | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x020a | 0x0a | BLE\_ERR\_SYNCH\_CONN\_LIMIT | Synchronous Connection Limit To A Device Exceeded | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x020b | 0x0b | BLE\_ERR\_ACL\_CONN\_EXISTS | ACL Connection Already Exists | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x020c | 0x0c | BLE\_ERR\_CMD\_DISALLOWED | Command Disallowed | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x020d | 0x0d | BLE\_ERR\_CONN\_REJ\_RESOURCES | Connection Rejected due to Limited Resources | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x020e | 0x0e | BLE\_ERR\_CONN\_REJ\_SECURITY | Connection Rejected Due To Security Reasons | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x020f | 0x0f | BLE\_ERR\_CONN\_REJ\_BD\_ADDR | Connection Rejected due to Unacceptable BD\_ADDR | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0210 | 0x10 | BLE\_ERR\_CONN\_ACCEPT\_TMO | Connection Accept Timeout Exceeded | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0211 | 0x11 | BLE\_ERR\_UNSUPPORTED | Unsupported Feature or Parameter Value | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0212 | 0x12 | BLE\_ERR\_INV\_HCI\_CMD\_PARMS | Invalid HCI Command Parameters | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0213 | 0x13 | BLE\_ERR\_REM\_USER\_CONN\_TERM | Remote User Terminated Connection | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0214 | 0x14 | BLE\_ERR\_RD\_CONN\_TERM\_RESRCS | Remote Device Terminated Connection due to Low Resources | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0215 | 0x15 | BLE\_ERR\_RD\_CONN\_TERM\_PWROFF | Remote Device Terminated Connection due to Power Off | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0216 | 0x16 | BLE\_ERR\_CONN\_TERM\_LOCAL | Connection Terminated By Local Host | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0217 | 0x17 | BLE\_ERR\_REPEATED\_ATTEMPTS | Repeated Attempts | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0218 | 0x18 | BLE\_ERR\_NO\_PAIRING | Pairing Not Allowed | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0219 | 0x19 | BLE\_ERR\_UNK\_LMP | Unknown LMP PDU | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x021a | 0x1a | BLE\_ERR\_UNSUPP\_REM\_FEATURE | Unsupported Remote Feature / Unsupported LMP Feature | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x021b | 0x1b | BLE\_ERR\_SCO\_OFFSET | SCO Offset Rejected | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x021c | 0x1c | BLE\_ERR\_SCO\_ITVL | SCO Interval Rejected | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x021d | 0x1d | BLE\_ERR\_SCO\_AIR\_MODE | SCO Air Mode Rejected | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x021e | 0x1e | BLE\_ERR\_INV\_LMP\_LL\_PARM | Invalid LMP Parameters / Invalid LL Parameters | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x021f | 0x1f | BLE\_ERR\_UNSPECIFIED | Unspecified Error | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0220 | 0x20 | BLE\_ERR\_UNSUPP\_LMP\_LL\_PARM | Unsupported LMP Parameter Value / Unsupported LL Parameter Value | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0221 | 0x21 | BLE\_ERR\_NO\_ROLE\_CHANGE | Role Change Not Allowed | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0222 | 0x22 | BLE\_ERR\_LMP\_LL\_RSP\_TMO | LMP Response Timeout / LL Response Timeout | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0223 | 0x23 | BLE\_ERR\_LMP\_COLLISION | LMP Error Transaction Collision | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0224 | 0x24 | BLE\_ERR\_LMP\_PDU | LMP PDU Not Allowed | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0225 | 0x25 | BLE\_ERR\_ENCRYPTION\_MODE | Encryption Mode Not Acceptable | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0226 | 0x26 | BLE\_ERR\_LINK\_KEY\_CHANGE | Link Key cannot be Changed | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0227 | 0x27 | BLE\_ERR\_UNSUPP\_QOS | Requested QoS Not Supported | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0228 | 0x28 | BLE\_ERR\_INSTANT\_PASSED | Instant Passed | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0229 | 0x29 | BLE\_ERR\_UNIT\_KEY\_PAIRING | Pairing With Unit Key Not Supported | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x022a | 0x2a | BLE\_ERR\_DIFF\_TRANS\_COLL | Different Transaction Collision | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x022c | 0x2c | BLE\_ERR\_QOS\_PARM | QoS Unacceptable Parameter | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x022d | 0x2d | BLE\_ERR\_QOS\_REJECTED | QoS Rejected | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x022e | 0x2e | BLE\_ERR\_CHAN\_CLASS | Channel Classification Not Supported | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x022f | 0x2f | BLE\_ERR\_INSUFFICIENT\_SEC | Insufficient Security | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0230 | 0x30 | BLE\_ERR\_PARM\_OUT\_OF\_RANGE | Parameter Out Of Mandatory Range | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0232 | 0x32 | BLE\_ERR\_PENDING\_ROLE\_SW | Role Switch Pending | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0234 | 0x34 | BLE\_ERR\_RESERVED\_SLOT | Reserved Slot Violation | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0235 | 0x35 | BLE\_ERR\_ROLE\_SW\_FAIL | Role Switch Failed | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0236 | 0x36 | BLE\_ERR\_INQ\_RSP\_TOO\_BIG | Extended Inquiry Response Too Large | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0237 | 0x37 | BLE\_ERR\_SEC\_SIMPLE\_PAIR | Secure Simple Pairing Not Supported By Host | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0238 | 0x38 | BLE\_ERR\_HOST\_BUSY\_PAIR | Host Busy - Pairing | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0239 | 0x39 | BLE\_ERR\_CONN\_REJ\_CHANNEL | Connection Rejected due to No Suitable Channel Found | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x023a | 0x3a | BLE\_ERR\_CTLR\_BUSY | Controller Busy | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x023b | 0x3b | BLE\_ERR\_CONN\_PARMS | Unacceptable Connection Parameters | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x023c | 0x3c | BLE\_ERR\_DIR\_ADV\_TMO | Directed Advertising Timeout | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x023d | 0x3d | BLE\_ERR\_CONN\_TERM\_MIC | Connection Terminated due to MIC Failure | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x023e | 0x3e | BLE\_ERR\_CONN\_ESTABLISHMENT | Connection Failed to be Established | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x023f | 0x3f | BLE\_ERR\_MAC\_CONN\_FAIL | MAC Connection Failed | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ +| 0x0240 | 0x40 | BLE\_ERR\_COARSE\_CLK\_ADJ | Coarse Clock Adjustment Rejected but Will Try to Adjust Using Clock Dragging | ++----------------+----------------+------------------------------------+--------------------------------------------------------------------------------+ + +Return codes - L2CAP +^^^^^^^^^^^^^^^^^^^^ + ++----------------+----------------+----------------------------------------------+------------------------------------------------------+ +| NimBLE Value | Formal Value | Name | Condition | ++================+================+==============================================+======================================================+ +| 0x0300 | 0x00 | BLE\_L2CAP\_SIG\_ERR\_CMD\_NOT\_UNDERSTOOD | Invalid or unsupported incoming L2CAP sig command. | ++----------------+----------------+----------------------------------------------+------------------------------------------------------+ +| 0x0301 | 0x01 | BLE\_L2CAP\_SIG\_ERR\_MTU\_EXCEEDED | Incoming packet too large. | ++----------------+----------------+----------------------------------------------+------------------------------------------------------+ +| 0x0302 | 0x02 | BLE\_L2CAP\_SIG\_ERR\_INVALID\_CID | No channel with specified ID. | ++----------------+----------------+----------------------------------------------+------------------------------------------------------+ + +Return codes - Security manager (us) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| NimBLE Value | Formal Value | Name | Condition | ++================+================+===================================+===========================================================================================================================================+ +| 0x0401 | 0x01 | BLE\_SM\_ERR\_PASSKEY | The user input of passkey failed, for example, the user cancelled the operation. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0402 | 0x02 | BLE\_SM\_ERR\_OOB | The OOB data is not available. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0403 | 0x03 | BLE\_SM\_ERR\_AUTHREQ | The pairing procedure cannot be performed as authentication requirements cannot be met due to IO capabilities of one or both devices. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0404 | 0x04 | BLE\_SM\_ERR\_CONFIRM\_MISMATCH | The confirm value does not match the calculated compare value. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0405 | 0x05 | BLE\_SM\_ERR\_PAIR\_NOT\_SUPP | Pairing is not supported by the device. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0406 | 0x06 | BLE\_SM\_ERR\_ENC\_KEY\_SZ | The resultant encryption key size is insufficient for the security requirements of this device. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0407 | 0x07 | BLE\_SM\_ERR\_CMD\_NOT\_SUPP | The SMP command received is not supported on this device. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0408 | 0x08 | BLE\_SM\_ERR\_UNSPECIFIED | Pairing failed due to an unspecified reason. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0409 | 0x09 | BLE\_SM\_ERR\_REPEATED | Pairing or authentication procedure is disallowed because too little time has elapsed since last pairing request or security request. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x040a | 0x0a | BLE\_SM\_ERR\_INVAL | The Invalid Parameters error code indicates that the command length is invalid or that a parameter is outside of the specified range. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x040b | 0x0b | BLE\_SM\_ERR\_DHKEY | Indicates to the remote device that the DHKey Check value received doesn’t match the one calculated by the local device. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x040c | 0x0c | BLE\_SM\_ERR\_NUMCMP | Indicates that the confirm values in the numeric comparison protocol do not match. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x040d | 0x0d | BLE\_SM\_ERR\_ALREADY | Indicates that the pairing over the LE transport failed due to a Pairing Request sent over the BR/EDR transport in process. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x040e | 0x0e | BLE\_SM\_ERR\_CROSS\_TRANS | Indicates that the BR/EDR Link Key generated on the BR/EDR transport cannot be used to derive and distribute keys for the LE transport. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ + +Return codes - Security manager (peer) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| NimBLE Value | Formal Value | Name | Condition | ++================+================+===================================+===========================================================================================================================================+ +| 0x0501 | 0x01 | BLE\_SM\_ERR\_PASSKEY | The user input of passkey failed, for example, the user cancelled the operation. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0502 | 0x02 | BLE\_SM\_ERR\_OOB | The OOB data is not available. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0503 | 0x03 | BLE\_SM\_ERR\_AUTHREQ | The pairing procedure cannot be performed as authentication requirements cannot be met due to IO capabilities of one or both devices. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0504 | 0x04 | BLE\_SM\_ERR\_CONFIRM\_MISMATCH | The confirm value does not match the calculated compare value. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0505 | 0x05 | BLE\_SM\_ERR\_PAIR\_NOT\_SUPP | Pairing is not supported by the device. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0506 | 0x06 | BLE\_SM\_ERR\_ENC\_KEY\_SZ | The resultant encryption key size is insufficient for the security requirements of this device. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0507 | 0x07 | BLE\_SM\_ERR\_CMD\_NOT\_SUPP | The SMP command received is not supported on this device. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0508 | 0x08 | BLE\_SM\_ERR\_UNSPECIFIED | Pairing failed due to an unspecified reason. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x0509 | 0x09 | BLE\_SM\_ERR\_REPEATED | Pairing or authentication procedure is disallowed because too little time has elapsed since last pairing request or security request. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x050a | 0x0a | BLE\_SM\_ERR\_INVAL | The Invalid Parameters error code indicates that the command length is invalid or that a parameter is outside of the specified range. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x050b | 0x0b | BLE\_SM\_ERR\_DHKEY | Indicates to the remote device that the DHKey Check value received doesn’t match the one calculated by the local device. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x050c | 0x0c | BLE\_SM\_ERR\_NUMCMP | Indicates that the confirm values in the numeric comparison protocol do not match. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x050d | 0x0d | BLE\_SM\_ERR\_ALREADY | Indicates that the pairing over the LE transport failed due to a Pairing Request sent over the BR/EDR transport in process. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ +| 0x050e | 0x0e | BLE\_SM\_ERR\_CROSS\_TRANS | Indicates that the BR/EDR Link Key generated on the BR/EDR transport cannot be used to derive and distribute keys for the LE transport. | ++----------------+----------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/docs/ble_intro.rst b/docs/ble_intro.rst new file mode 100644 index 000000000..f47a78b76 --- /dev/null +++ b/docs/ble_intro.rst @@ -0,0 +1,122 @@ +BLE User Guide +---------------- + +Apache Mynewt offers the world's first fully open-source Bluetooth Low +Energy (BLE) or Bluetooth Smart stack fully compliant with Bluetooth 5 +specifications with support for Bluetooth Mesh. It is called NimBLE. + +BLE technology operates in the unlicensed industrial, scientific and +medical (ISM) band at 2.4 to 2.485 GHz which is available in most +countries. It uses a spread spectrum, frequency hopping, full-duplex +signal. BLE FHSS employs 40 2-MHz-wide channels to ensure greater +reliability over longer distances. It also features 0-dBm (1 mW) power +output and a typical maximum range of 50 meters. With Bluetooth 5 +specification range can be increased 4 times and speed 2 time. + +.. toctree:: + :hidden: + :titlesonly: + + ble_sec + ble_setup/ble_setup_intro + ble_hs/ble_hs + btshell Usage API + mesh/index + +.. contents:: + :local: + :depth: 2 + +Note that BLE is not compatible with standard Bluetooth. + +Features +~~~~~~~~ + +NimBLE complies with Bluetooth Core Specification 5.0 which makes it an +ideal wireless technology for the Internet of Things (IoT). + +- LE Advertising Extensions +- 2Msym/s PHY for higher throughput +- Coded PHY for LE Long Range +- High Duty Cycle Non-Connectable Advertising +- Channel Selection Algorithm #2 to utilize channels in more efficient + way. +- LE Privacy 1.2 for frequent changes to the device address to make it + difficult to track for outsiders +- LE Secure Connections featuring FIPS-compliant algorithms. +- LE Data Length Extension for higher throughput +- **Coming Soon**: Assigning an Internet Protocol (IP) address + (complaint with the IPv6 or 6LoWPAN standard) to a Bluetooth device + through Internet Protocol Support Profile (IPSP) + +The Bluetooth 5 is backward compatible with previous Bluetooth version +4.2 which is also supported by Apache Mynewt. + +Bluetooth Mesh features +~~~~~~~~~~~~~~~~~~~~~~~ + +Bluetooth Mesh is a great addition to and opens a wide range of new +possibilities for the IoT connectivity space. NimBLE fully supports the +following Bluetooth Mesh features: + +- Advertising and GATT bearers +- PB-GATT and PB-ADV provisioning +- Foundation Models (server role) +- Relay support +- GATT Proxy + +Components +~~~~~~~~~~ + +A Bluetooth low energy stack (NimBLE included) consists of two +components with several subcomponents: + +- **Controller** + + - **Physical Layer**: adaptive frequency-hopping Gaussian Frequency + Shift Keying (GFSK) radio using 40 RF channels (0-39), with 2 MHz + spacing. + - **Link Layer**: with one of five states (Standby, Advertising, + Scanning, Initiating, Connection states) active at any time + +- **Host** + + - **Logical Link Control and Adaptation Protocol (L2CAP)**: provides + logical channels, named L2CAP channels, which are multiplexed over + one or more logical links to provide packet segmentation and + reassembly, flow control, error control, streaming, QoS etc. + - **Security Manager (SM)**: uses Security Manager Protocol (SMP) + for pairing and transport specific key distribution for securing + radio communication + - **Attribute protocol (ATT)**: allows a device (*Server*) to expose + certain pieces of data, known as *Attributes*, to another device + (*Client*) + - **Generic Attribute Profile (GATT)**: a framework for using the + ATT protocol to exchange attributes encapsulated as + *Characteristics* or *Services* + - **Generic Access Profile (GAP)**: a base profile which all + Bluetooth devices implement, which in the case of LE, defines the + Physical Layer, Link Layer, L2CAP, Security Manager, Attribute + Protocol and Generic Attribute Profile. + - **Host Controller Interface (HCI)**: the interface between the + host and controller either through software API or by a hardware + interface such as SPI, UART or USB. + +Subsequent chapters in this manual will go into the details of the +implementation of each component, APIs available, and things to consider +while designing a NimBLE app. + +Example NimBLE projects +~~~~~~~~~~~~~~~~~~~~~~~ + +Mynewt comes with two built-in projects that allow users to play with +NimBLE, try the tutorials out with, and see how to use available +services. + +1. **bletiny** : A simple shell application which provides a basic + interface to the host-side of the BLE stack. +2. **bleprph**: A basic peripheral device with no user interface. It + advertises automatically on startup, and resumes advertising whenever + a connection is terminated. It supports a maximum of one connection. +3. **blemesh**: A sample application for Bluetooth Mesh Node using + on/off model. diff --git a/docs/ble_sec.rst b/docs/ble_sec.rst new file mode 100644 index 000000000..0cc15e634 --- /dev/null +++ b/docs/ble_sec.rst @@ -0,0 +1,76 @@ +NimBLE Security +--------------- + +The Bluetooth Low Energy security model includes five distinct security +concepts as listed below. For detailed specifications, see BLUETOOTH +SPECIFICATION Version 4.2 [Vol 1, Part A]. + +- **Pairing**: The process for creating one or more shared secret keys. + In LE a single link key is generated by combining contributions from + each device into a link key used during pairing. + +- **Bonding**: The act of storing the keys created during pairing for + use in subsequent connections in order to form a trusted device pair. + +- **Device authentication**: Verification that the two devices have the + same keys (verify device identity) + +- **Encryption**: Keeps message confidential. Encryption in Bluetooth + LE uses AES-CCM cryptography and is performed in the *Controller*. + +- **Message integrity**: Protects against message forgeries. + +Bluetooth LE uses four association models depending on the I/O +capabilities of the devices. + +- **Just Works**: designed for scenarios where at least one of the + devices does not have a display capable of displaying a six digit + number nor does it have a keyboard capable of entering six decimal + digits. + +- **Numeric Comparison**: designed for scenarios where both devices are + capable of displaying a six digit number and both are capable of + having the user enter "yes" or "no". A good example of this model is + the cell phone / PC scenario. + +- **Out of Band**: designed for scenarios where an Out of Band + mechanism is used to both discover the devices as well as to exchange + or transfer cryptographic numbers used in the pairing process. + +- **Passkey Entry**: designed for the scenario where one device has + input capability but does not have the capability to display six + digits and the other device has output capabilities. A good example + of this model is the PC and keyboard scenario. + +Key Generation +~~~~~~~~~~~~~~ + +Key generation for all purposes in Bluetooth LE is performed by the +*Host* on each LE device independent of any other LE device. + +Privacy Feature +~~~~~~~~~~~~~~~ + +Bluetooth LE supports an optional feature during connection mode and +connection procedures that reduces the ability to track a LE device over +a period of time by changing the Bluetooth device address on a frequent +basis. + +There are two variants of the privacy feature. + +- In the first variant, private addresses are resolved and generated by + the *Host*. +- In the second variant, private addresses are resolved and generated + by the *Controller* without involving the Host after the Host + provides the Controller device identity information. The Host may + provide the Controller with a complete resolving list or a subset of + the resolving list. Device filtering becomes possible in the second + variant when address resolution is performed in the Controller + because the peer’s device identity address can be resolved prior to + checking whether it is in the white list. + +**Note**: When address resolution is performed exclusively in the Host, +a device may experience increased power consumption because device +filtering must be disabled. For more details on the privacy feature, +refer to BLUETOOTH SPECIFICATION Version 4.2 [Vol 3, Part C] (Published +02 December 2014), Page 592. diff --git a/docs/ble_setup/ble_addr.rst b/docs/ble_setup/ble_addr.rst new file mode 100644 index 000000000..71c6d43e7 --- /dev/null +++ b/docs/ble_setup/ble_addr.rst @@ -0,0 +1,63 @@ +Configure device address +------------------------ + +A BLE device needs an address to do just about anything. For information +on the various types of Bluetooth addresses, see the `NimBLE Host +Identity Reference :doc:`<../../../network/ble/ble_hs/ble_hs_id/ble_hs_id>`. + +There are several methods for assigning an address to a NimBLE device. +The available options are documented below: + +Method 1: Configure nRF hardware with a public address +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When Mynewt is running on a Nordic nRF platform, the NimBLE controller +will attempt to read a public address out of the board's FICR or UICR +registers. The controller uses the following logic while trying to read +an address from hardware: + +1. If the *DEVICEADDRTYPE* FICR register is written, read the address + programmed in the *DEVICEADDR[0]* and *DEVICEADDR[1]* FICR registers. +2. Else if the upper 16 bits of the *CUSTOMER[1]* UICR register are 0, + read the address programmed in the *CUSTOMER[0]* and *CUSTOMER[1]* + UCI registers. +3. Else, no address available. + +Method 2: Hardcode a public address in the Mynewt target +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The NimBLE controller package exports a +:doc:`syscfg <../../../os/modules/sysinitconfig/sysinitconfig>` setting +called ``BLE_PUBLIC_DEV_ADDR``. This setting can be overridden at the +application or target level to configure a public Bluetooth address. For +example, a target can assign the public address *11:22:33:44:55:66* as +follows: + +:: + + syscfg.vals: + BLE_PUBLIC_DEV_ADDR: '(uint8_t[6]){0x66, 0x55, 0x44, 0x33, 0x22, 0x11}' + +This setting takes the form of a C expression. Specifically, the value +is a designated initializer expressing a six-byte array. Also note that +the bytes are reversed, as an array is inherently little-endian, while +addresses are generally expressed in big-endian. + +Note: this method takes precedence over method 1. Whatever is written to +the ``BLE_PUBLIC_DEV_ADDR`` setting is the address that gets used. + +Method 3: Configure a random address at runtime +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Random addresses get configured through the NimBLE host. The following +two functions are used in random address configuration: + +- :doc:`ble_hs_id_gen_rnd <../../../network/ble/ble_hs/ble_hs_id/functions/ble_hs_id_gen_rnd>`: + Generates a new random address. +- :doc:`ble_hs_id_set_rnd <../../../network/ble/ble_hs/ble_hs_id/functions/ble_hs_id_set_rnd>`: + Sets the device's random address. + +For an example of how this is done, see the :doc:`<../../../os/tutorials/ibeacon>`. + +*Note:* A NimBLE device can be configured with multiple addresses; at +most one of each address type. diff --git a/docs/ble_setup/ble_lp_clock.rst b/docs/ble_setup/ble_lp_clock.rst new file mode 100644 index 000000000..34a967fec --- /dev/null +++ b/docs/ble_setup/ble_lp_clock.rst @@ -0,0 +1,67 @@ +Configure clock for controller +------------------------------ + +The NimBLE stack uses OS cputime for scheduling various events inside +controller. Since the code of controller is optimized to work with 32768 +Hz clock, the OS cputime has to be configured accordingly. + +To make things easier, controller package (``net/nimble/controller``) +defines new system configuration setting ``BLE_LP_CLOCK`` as sets it to +``1`` so other packages can be configured if necessary. The next section +describes configuration required for controller to work properly. + +System configuration +~~~~~~~~~~~~~~~~~~~~ + +**Note:** All BSPs based on nRF5x have below settings automatically +applied when ``BLE_LP_CLOCK`` is set, there is no need to configure this +in application. + +The following things need to be configured for NimBLE controller to work +properly: + +- OS cputime frequency shall be set to ``32768`` +- OS cputime timer source shall be set to 32768 Hz clock source +- Default 1 MHz clock source can be disabled if not used by application +- 32768 Hz clock source shall be enabled +- Crystal settling time shall be set to non-zero value (see below) + +For example, on nRF52 platform timer 5 can be used as source for 32768 +Hz clock. Also, timer 0 can be disabled since this is the default source +for OS cputime clock and is no longer used. The configuration will look +as below: + +:: + + syscfg.vals: + OS_CPUTIME_FREQ: 32768 + OS_CPUTIME_TIMER_NUM: 5 + TIMER_0: 0 + TIMER_5: 1 + BLE_XTAL_SETTLE_TIME: 1500 + +On nRF51 platform the only difference is to use timer 3 instead of timer +5. + +On platforms without 32768 Hz crystal available it usually can be +synthesized by setting ``XTAL_32768_SYNTH`` to ``1`` - this is also +already configured in existing BSPs. + +Crystal settle time configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The configuration variable ``BLE_XTAL_SETTLE_TIME`` is used by the +controller to turn on the necessary clock source(s) for the radio and +associated peripherals prior to Bluetooth events (advertising, scanning, +connections, etc). For the nRF5x platforms, the HFXO needs to be turned +on prior to using the radio and the ``BLE_XTAL_SETTLE_TIME`` must be set +to accommodate this time. The amount of time required is board +dependent, so users must characterize their hardware and set +``BLE_XTAL_SETTLE_TIME`` accordingly. The current value of 1500 +microseconds is a fairly long time and was intended to work for most, if +not all, platforms. + +Note that changing this time will impact battery life with the amount +depending on the application. The HFXO draws a fairly large amount of +current when running so keeping this time as small as possible will +reduce overall current drain. diff --git a/docs/ble_setup/ble_setup_intro.rst b/docs/ble_setup/ble_setup_intro.rst new file mode 100644 index 000000000..806817c62 --- /dev/null +++ b/docs/ble_setup/ble_setup_intro.rst @@ -0,0 +1,13 @@ +NimBLE Setup +------------ + +Most NimBLE initialization is done automatically by +:doc:`sysinit <../../../os/modules/sysinitconfig/sysinitconfig>`. This +section documents the few bits of initialization that an application +must perform manually. + +.. toctree:: + + ble_lp_clock + ble_addr + ble_sync_cb diff --git a/docs/ble_setup/ble_sync_cb.rst b/docs/ble_setup/ble_sync_cb.rst new file mode 100644 index 000000000..facf37a5c --- /dev/null +++ b/docs/ble_setup/ble_sync_cb.rst @@ -0,0 +1,80 @@ +Respond to *sync* and *reset* events +------------------------------------ + +sync +~~~~ + +The NimBLE stack is inoperable while the host and controller are out of +sync. In a combined host-controller app, the sync happens immediately at +startup. When the host and controller are separate, sync typically +occurs in under a second after the application starts. An application +learns when sync is achieved by configuring the host's *sync callback*: +``ble_hs_cfg.sync_cb``. The host calls the sync callback whenever sync +is acquired. The sync callback has the following form: + +.. code-block:: cpp + + typedef void ble_hs_sync_fn(void); + +Because the NimBLE stack begins in the unsynced state, the application +should delay all BLE operations until the sync callback has been called. + +reset +~~~~~ + +Another event indicated by the host is a *controller reset*. The NimBLE +stack resets itself when a catastrophic error occurs, such as loss of +communication between the host and controller. Upon resetting, the host +drops all BLE connections and loses sync with the controller. After a +reset, the application should refrain from using the host until sync is +again signaled via the sync callback. + +An application learns of a host reset by configuring the host's *reset +callback*: ``ble_hs_cfg.reset_cb``. This callback has the following +form: + +.. code-block:: cpp + + typedef void ble_hs_reset_fn(int reason); + +The ``reason`` parameter is a :doc:`NimBLE host return +code <../../../network/ble/ble_hs/ble_hs_return_codes>`. + +Example +~~~~~~~ + +The following example demonstrates the configuration of the sync and +reset callbacks. + +.. code-block:: cpp + + #include "sysinit/sysinit.h" + #include "console/console.h" + #include "host/ble_hs.h" + + static void + on_sync(void) + { + /* Begin advertising, scanning for peripherals, etc. */ + } + + static void + on_reset(int reason) + { + console_printf("Resetting state; reason=%d\n", reason); + } + + int + main(void) + { + /* Initialize all packages. */ + sysinit(); + + ble_hs_cfg.sync_cb = on_sync; + ble_hs_cfg.reset_cb = on_reset; + + /* As the last thing, process events from default event queue. */ + while (1) { + os_eventq_run(os_eventq_dflt_get()); + } + } diff --git a/docs/btshell/btshell_GAP.rst b/docs/btshell/btshell_GAP.rst new file mode 100644 index 000000000..ce6475554 --- /dev/null +++ b/docs/btshell/btshell_GAP.rst @@ -0,0 +1,660 @@ +GAP API for btshell +=================== + +Generic Access Profile (GAP) defines the generic procedures related to discovery of Bluetooth devices (idle mode +procedures) and link management aspects of connecting to Bluetooth devices (connecting mode procedures). It also defines +procedures related to use of different security levels. + +Several different modes and procedures may be performed simultaneously over an LE physical transport. The following +modes and procedures are defined for use over an LE physical transport: + +1. **Broadcast mode and observation procedure** + + - These allow two devices to communicate in a unidirectional connectionless manner using the advertising events. + +2. **Discovery modes and procedures** + + - All devices shall be in either non-discoverable mode or one of the discoverable modes. + - A device in the discoverable mode shall be in either the general discoverable mode or the limited discoverable mode. + - A device in non-discoverable mode will not be discovered by any device that is performing either the general + discovery procedure or the limited discovery procedure. + +3. **Connection modes and procedures** + + - allow a device to establish a connection to another device. + - allow updating of parameters of the connection + - allow termination of the connection + +4. **Bonding modes and procedures** + + - Bonding allows two connected devices to exchange and store security and identity information to create a trusted + relationship. + - Bonding can occur only between two devices in bondable mode. + +Available commands +~~~~~~~~~~~~~~~~~~ + +Parameters default values are marked red. + +Configuration +------------- + ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| **Command** | **Parmeters** | \*\* Possible values\*\* | **Description** | ++=====================+=================+============================+=========================================================================================================+ +| **set** | | | Set configuration options | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | addr | XX:XX:XX:XX:XX:XX | Local device address | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | addr\_type | ``public`` | Local device address type | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | | random | Use random address for scan requests | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | mtu | [23-UINT16\_MAX] | GATT Maximum Transmission Unit (MTU) | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | irk | XX:XX:XX... | Local Identity Resolving Key (16 byte | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| **set-priv-mode** | | | Set privacy mode for device | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | addr | XX:XX:XX:XX:XX:XX | Remote device address | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | addr\_type | ``public`` | Remote device public address type | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | | random | Remote device random address type | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | mode | [``0``-1] | 0 - use network privacy, 1 - use device privacy | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| **white-list** | | | Add devices to white list (this command accepts multiple instances of addr and addr\_type parameters) | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | addr | XX:XX:XX:XX:XX:XX | Remote device address | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | addr\_type | ``public`` | Remote device public address type | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ +| | | random | Remote device random address type | ++---------------------+-----------------+----------------------------+---------------------------------------------------------------------------------------------------------+ + +Device discovery and connection +------------------------------- + ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **Command** | **Parmeters** | \*\* Possible values\*\* | **Description** | ++==========================+================================+============================+============================================================================================================+ +| **scan** | | | Discover remote devices | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | cancel | | cancel ongoing scan procedure | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | extended | ``none`` | Start legacy scan | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | 1M | Start extended scan on 1M PHY | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | coded | Start extended scan on Coded PHY | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | both | Start extended scan on both PHYs | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | duration | [1-``INT32_MAX``], | Duration of scan in milliseconds | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | limited | [``0``-1] | Use limited discovery procedure | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | passive | [``0``-1] | Use passive scan | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | interval | [``0``-UINT16\_MAX] | Scan interval, if 0 use stack's default | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | window | [``0``-UINT16\_MAX] | Scan window, if 0 use stack's default | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | filter | ``no_wl`` | Scan filter policy - Accept all advertising packets | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | use\_wl | Accept only advertising packets from devices on White List | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | no\_wl\_inita | Accept all advertising packets (including directed RPA) | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | use\_wl\_inita | Accept only advertising packets from devices on White List (including directed RPA) | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | nodups | [``0``-1] | Disable duplicates filtering | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | own\_addr\_type | ``public`` | Use public address for scan requests | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | random | Use random address for scan requests | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | rpa\_pub | Use RPA address for scan requests (fallback to public if no IRK) | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | rpa\_rnd | Use RPA address for scan requests (fallback to random if no IRK) | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | extended\_duration | [``0``-UINT16\_MAX] | Duration of extended scan in 10 milliseconds | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | extended\_period | [``0``-UINT16\_MAX] | Periodic scan interval in 1.28 seconds (0 disabled) | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | longrange\_interval | [``0``-UINT16\_MAX] | Scan interval for Coded Scan , if 0 use stack's default | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | longrange\_window | [``0``-UINT16\_MAX] | Scan window for Coded Scan , if 0 use stack's default | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | longrange\_passive | [``0``-1] | Use passive scan for Coded Scan | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **connect** | | | Initiate connection to remote device | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | cancel | | Cancel ongoing connection procedure | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | extended | ``none`` | Use legacy connection procedure | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | 1M | Extended connect using 1M PHY scan parameters | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | coded | Extended connect using Coded PHY scan parameters | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | both | Extended connect using 1M and Coded PHYs scan parameters | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | all | Extended connect using 1M and Coded PHYs scan parameters (Provide also connection parameters for 2M PHY) | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | peer\_addr\_type | ``public`` | Remote device public address type | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | random | Remote device random address type | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | public\_id | Remote device public address type (Identity) | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | random\_id | Remote device random address type (Identity) | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | peer\_addr | XX:XX:XX:XX:XX:XX | Remote device address | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | own\_addr\_type | ``public`` | Use public address for scan requests | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | random | Use random address for scan requests | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | rpa\_pub | Use RPA address for scan requests (fallback to public if no IRK) | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | | rpa\_rnd | Use RPA address for scan requests (fallback to random if no IRK) | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | duration | [``0``-INT32\_MAX] | Connection attempt duration, if 0 use stack's default | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | scan\_interval | [0-UINT16\_MAX] | Scan interval, default: 0x0010 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | scan\_window | [0-UINT16\_MAX] | Scan window, default: 0x0010 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | interval\_min | [0-UINT16\_MAX] | Minimum connection interval, default: 30 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | interval\_max | [0-UINT16\_MAX] | Maximum connection interval, default: 50 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | latency | [UINT16] | Connection latency, default: 0 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | timeout | [UINT16] | Connection timeout, default: 0x0100 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | min\_conn\_event\_len | [UINT16] | Minimum length of connection event, default: 0x0010 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | max\_conn\_event\_len | [UINT16] | Maximum length of connection event, default: 0x0300 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | coded\_scan\_interval | [0-UINT16\_MAX] | Coded PHY Scan interval, default: 0x0010 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | coded\_scan\_window | [0-UINT16\_MAX] | Coded PHY Scan window, default: 0x0010 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | coded\_interval\_min | [0-UINT16\_MAX] | Coded PHY Minimum connection interval, default: 30 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | coded\_interval\_max | [0-UINT16\_MAX] | Coded PHY Maximum connection interval, default: 50 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | coded\_latency | [UINT16] | Coded PHY Connection latency, default: 0 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | coded\_timeout | [UINT16] | Coded PHY Connection timeout, default: 0x0100 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | coded\_min\_conn\_event\_len | [UINT16] | Coded PHY Minimum length of connection event, default: 0x0010 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | coded\_max\_conn\_event\_len | [UINT16] | Coded PHY Maximum length of connection event, default: 0x0300 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | 2M\_scan\_interval | [0-UINT16\_MAX] | 2M PHY Scan interval, default: 0x0010 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | 2M\_scan\_window | [0-UINT16\_MAX] | 2M PHY Scan window, default: 0x0010 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | 2M\_interval\_min | [0-UINT16\_MAX] | 2M PHY Minimum connection interval, default: 30 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | 2M\_interval\_max | [0-UINT16\_MAX] | 2M PHY Maximum connection interval, default: 50 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | 2M\_latency | [UINT16] | 2M PHY Connection latency, default: 0 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | 2M\_timeout | [UINT16] | 2M PHY Connection timeout, default: 0x0100 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | 2M\_min\_conn\_event\_len | [UINT16] | 2M PHY Minimum length of connection event, default: 0x0010 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | 2M\_max\_conn\_event\_len | [UINT16] | 2M PHY Maximum length of connection event, default: 0x0300 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **disconnect** | | | Disconnect exisiting connection | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | reason | [UINT8] | Disconnect reason | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **show-addr** | | | Show local public and random identity addresses | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **show-conn** | | | Show current connections | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **conn-rssi** | | | Obtain RSSI of specified connection | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **conn-update-params** | | | Update parameters of specified connection | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | interval\_min | [0-UINT16\_MAX] | Minimum connection interval, default: 30 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | interval\_max | [0-UINT16\_MAX] | Maximum connection interval, default: 50 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | latency | [UINT16] | Connection latency, default: 0 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | timeout | [UINT16] | Connection timeout, default: 0x0100 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | min\_conn\_event\_len | [UINT16] | Minimum length of connection event, default: 0x0010 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | max\_conn\_event\_len | [UINT16] | Maximum length of connection event, default: 0x0300 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **conn-datalen** | | | Set DLE parmaeters for connection | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | octets | [UINT16] | Maximum transmission packet size | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | time | [UINT16] | Maximum transmission packet time | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **phy-set** | | | Set prefered PHYs used for connection | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | tx\_phys\_mask | [UINT8] | Prefered PHYs on TX is mask of following bits0x00 - no preference0x01 - 1M, 0x02 - 2M, 0x04 - Coded | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | rx\_phys\_mask | [UINT8] | Prefered PHYs on RX is mask of following bits0x00 - no preference0x01 - 1M, 0x02 - 2M, 0x04 - Coded | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | phy\_opts | [UINT16] | Options for Coded PHY 0 - any coding, 1 - prefer S2, 2 - prefer S8 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **phy-set-default** | | | Set default prefered PHYs used for new connection | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | tx\_phys\_mask | [UINT8] | Prefered PHYs on TX is mask of following bits0x00 - no preference0x01 - 1M, 0x02 - 2M, 0x04 - Coded | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | rx\_phys\_mask | [UINT8] | Prefered PHYs on RX is mask of following bits0x00 - no preference0x01 - 1M, 0x02 - 2M, 0x04 - Coded | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **phy-read** | | | Read connection current PHY | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| **l2cap-update** | | | Update connection parameters | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | interval\_min | [0-UINT16\_MAX] | Minimum connection interval, default: 30 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | interval\_max | [0-UINT16\_MAX] | Maximum connection interval, default: 50 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | latency | [UINT16] | Connection latency, default: 0 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ +| | timeout | [UINT16] | Connection timeout, default: 0x0100 | ++--------------------------+--------------------------------+----------------------------+------------------------------------------------------------------------------------------------------------+ + +Security +-------- + ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| **Command** | **Parmeters** | \*\* Possible values\*\* | **Description** | ++===========================+====================+============================+============================================================================================================================+ +| **security-set-data** | | | Set security configuration | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | oob-flag | [``0``-1] | Set Out-Of-Band (OOB) flag in Security Manager | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | mitm-flag | [``0``-1] | Set Man-In-The-Middle (MITM) flag in Security Manager | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | io\_capabilities | 0 | Set Input-Output Capabilities to "DisplayOnly" | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | | 1 | Set Input-Output Capabilities to "DisplayYesNo" | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | | 2 | Set Input-Output Capabilities to "KeyboardOnly" | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | | 3 | Set Input-Output Capabilities to "NoInputNoOutput" | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | | 4 | Set Input-Output Capabilities to "KeyboardDisplay" | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | our\_key\_dist | [UINT8] | Set Local Keys Distribution, this is a bit field of possible values: LTK (0x01), IRK (0x02), CSRK (0x04), LTK\_SC(0x08) | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | their\_key\_dist | [UINT8] | Set Remote Keys Distribution, this is a bit field of possible values: LTK (0x01), IRK (0x02), CSRK (0x04), LTK\_SC(0x08) | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | bonding-flag | [``0``-1] | Set Bonding flag in Security Manager | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | sc-flag | [``0``-1] | Set Secure Connections flag in Security Manager | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| **security-pair** | | | Start pairing procedure | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| **security-encryption** | | | Start encryption procedure | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | ediv | [UINT16] | EDIV for LTK to use (use storage if not provided) | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | rand | [UINT64] | Rand for LTK | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | ltk | XX:XX:XX... | LTK (16 bytes) | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| **security-start** | | | Start security procedure (This starts either pairing or encryption depending if keys are stored) | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| **auth-passkey** | | | Reply to Passkey request | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | action | [UINT16] | Action to reply (as received in event) | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | key | [0-999999] | Passkey to reply (Input or Display action) | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | oob | XX:XX:XX:... | Out-Of-Band secret (16 bytes) (OOB action) | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ +| | yesno | Yy-Ny | Confirm passkey (for Passkey Confirm action) | ++---------------------------+--------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------+ + +Advertising with Extended Advertising enabled +--------------------------------------------- + ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| **Command** | **Parmeters** | \*\* Possible values\*\* | **Description** | ++==============================+==========================+============================+=====================================================================================+ +| **advertise-configure** | | | Configure new advertising instance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | instance | [``0``-UINT8\_MAX] | Advertising instance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | connectable | [``0``-1] | Use connectable advertising | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | scannable | [``0``-1] | Use scannable advertising | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | peer\_addr\_type | ``public`` | Remote device public address type | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | random | Remote device random address type | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | public\_id | Remote device public address type (Identity) | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | random\_id | Remote device random address type (Identity) | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | peer\_addr | XX:XX:XX:XX:XX:XX | Remote device address - if provided perform directed advertising | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | own\_addr\_type | ``public`` | Use public address for scan requests | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | random | Use random address for scan requests | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | rpa\_pub | Use RPA address for scan requests (fallback to public if no IRK) | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | rpa\_rnd | Use RPA address for scan requests (fallback to random if no IRK) | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | channel\_map | [``0``-UINT8\_MAX} | Primary advertising channels map. If 0 use all channels. | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | filter | ``none`` | Advertising filter policy - no filtering, no whitelist used | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | scan | process all connection requests but only scans from white list | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | conn | process all scan request but only connection requests from white list | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | both | ignore all scan and connection requests unless in white list | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | interval\_min | [``0``-UINT32\_MAX] | Minimum advertising interval in 0.625 miliseconds If 0 use stack default. | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | interval\_max | [``0``-UINT32\_MAX] | Maximum advertising interval in 0.625 miliseconds If 0 use stack default. | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | rx\_power | [-127 - ``127``] | Advertising TX power in dBm | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | primary\_phy | ``1M`` | Use 1M PHY on primary advertising channels | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | ``coded`` | Use Coded PHY on primary advertising channels | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | secondary\_phy | ``1M`` | Use 1M PHY on secondary advertising channels | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | ``coded`` | Use coded PHY on primary advertising channels | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | ``2M`` | Use 2M PHY on primary advertising channels | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | sid | [``0``-16] | Adsertising instance SID | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | high\_duty | [``0``-1] | Use high\_duty advertising | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | anonymous | [``0``-1] | Use anonymous advertising | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | legacy | [``0``-1] | Use legacy PDUs for advertising | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | include\_tx\_power | [``0``-1] | Include TX power information in advertising PDUs | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | scan\_req\_notif | [``0``-1] | Enable SCAN\_REQ notifications | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| **advertise-set-addr** | | | Configure *random* adress for instance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | instance | [``0``-UINT8\_MAX] | Advertising instance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | addr | XX:XX:XX:XX:XX:XX | Random address | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| **advertise-set-adv-data** | | | Configure advertising instance ADV\_DATA. This allow to configure following TLVs: | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| **advertise-set-scan-rsp** | | | Configure advertising instance SCAN\_RSP. This allow to configure following TLVs: | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | instance | [``0``-UINT8\_MAX] | Advertising instance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | flags | [``0``-UINT8\_MAX] | Flags value | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid16 | [UINT16] | 16-bit UUID value (can be passed multiple times) | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid16\_is\_complete | [``0``-1] | I 16-bit UUID list is complete | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid32 | [UINT32] | 32-bit UUID value (can be passed multiple times) | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid32\_is\_complete | [``0``-1] | I 32-bit UUID list is complete | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid128 | XX:XX:XX:... | 128-bit UUID value (16 bytes) (can be passed multiple times) | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid128\_is\_complete | [``0``-1] | I 128-bit UUID list is complete | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | tx\_power\_level | [-127 - 127] | TX Power level to include | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | appearance | [UINT16] | Appearance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | name | string | Name | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | advertising\_interval | [UINT16] | Advertising interval | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | service\_data\_uuid32 | XX:XX:XX:... | 32-bit UUID service data | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | service\_data\_uuid128 | XX:XX:XX:... | 128-bit UUID service data | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uri | XX:XX:XX:... | URI | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | msg\_data | XX:XX:XX:... | Manufacturer data | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | eddystone\_url | string | Eddystone with specified URL | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| **advertise-start** | | | Start advertising with configured instance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | instance | [``0``-UINT8\_MAX] | Advertising instance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | duration | [``0``-UINT16\_MAX] | Advertising duration in 10ms units. 0 - forver | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | max\_events | [``0``-UINT8\_MAX] | Maximum number of advertising events. 0 - no limit | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| **advertise-stop** | | | Stop advertising | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | instance | [``0``-UINT8\_MAX] | Advertising instance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| **advertise-remove** | | | Remove configured advertising instance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | instance | [``0``-UINT8\_MAX] | Advertising instance | ++------------------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ + +Legacy Advertising with Extended Advertising disabled +----------------------------------------------------- + ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| **Command** | **Parmeters** | \*\* Possible values\*\* | **Description** | ++====================+==========================+============================+=====================================================================================+ +| **advertise** | | | Enable advertising | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | stop | | Stop enabled advertising | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | conn | ``und`` | Connectable mode: undirected | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | non | non-connectable | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | dir | directed | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | discov | ``gen`` | Discoverable mode: general discoverable | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | ltd | limited discoverable | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | non | non-discoverable | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | scannable | [``0``-1] | Use scannable advertising | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | peer\_addr\_type | ``public`` | Remote device public address type | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | random | Remote device random address type | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | public\_id | Remote device public address type (Identity) | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | random\_id | Remote device random address type (Identity) | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | peer\_addr | XX:XX:XX:XX:XX:XX | Remote device address - if provided perform directed advertising | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | own\_addr\_type | ``public`` | Use public address for scan requests | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | random | Use random address for scan requests | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | rpa\_pub | Use RPA address for scan requests (fallback to public if no IRK) | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | rpa\_rnd | Use RPA address for scan requests (fallback to random if no IRK) | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | channel\_map | [``0``-UINT8\_MAX} | Primary advertising channels map. If 0 use all channels. | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | filter | ``none`` | Advertising filter policy - no filtering, no whitelist used | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | scan | process all connection requests but only scans from white list | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | conn | process all scan request but only connection requests from white list | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | | both | ignore all scan and connection requests unless in white list | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | interval\_min | [``0``-UINT32\_MAX] | Minimum advertising interval in 0.625 miliseconds If 0 use stack default. | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | interval\_max | [``0``-UINT32\_MAX] | Maximum advertising interval in 0.625 miliseconds If 0 use stack default. | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | high\_duty | [``0``-1] | Use high\_duty advertising | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | duration | [``1``-INT32\_MAX] | Advertising duration in ms | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| **set-adv-data** | | | Configure advertising instance ADV\_DATA. This allow to configure following TLVs: | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| **set-scan-rsp** | | | Configure advertising instance SCAN\_RSP. This allow to configure following TLVs: | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | flags | [``0``-UINT8\_MAX] | Flags value | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid16 | [UINT16] | 16-bit UUID value (can be passed multiple times) | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid16\_is\_complete | [``0``-1] | I 16-bit UUID list is complete | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid32 | [UINT32] | 32-bit UUID value (can be passed multiple times) | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid32\_is\_complete | [``0``-1] | I 32-bit UUID list is complete | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid128 | XX:XX:XX:... | 128-bit UUID value (16 bytes) (can be passed multiple times) | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uuid128\_is\_complete | [``0``-1] | I 128-bit UUID list is complete | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | tx\_power\_level | [-127 - 127] | TX Power level to include | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | appearance | [UINT16] | Appearance | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | name | string | Name | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | advertising\_interval | [UINT16] | Advertising interval | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | service\_data\_uuid32 | XX:XX:XX:... | 32-bit UUID service data | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | service\_data\_uuid128 | XX:XX:XX:... | 128-bit UUID service data | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | uri | XX:XX:XX:... | URI | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | msg\_data | XX:XX:XX:... | Manufacturer data | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ +| | eddystone\_url | string | Eddystone with specified URL | ++--------------------+--------------------------+----------------------------+-------------------------------------------------------------------------------------+ + +L2CAP Connection Oriented Channels +---------------------------------- + ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| **Command** | **Parmeters** | \*\* Possible values\*\* | **Description** | ++===========================+=================+============================+====================================================+ +| **l2cap-create-server** | | | Create L2CAP server | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| | psm | [UINT16] | PSM | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| **l2cap-connect** | | | Connect to remote L2CAP server | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| | psm | [UINT16] | PSM | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| **l2cap-disconnect** | | | Disconnec from L2CAP server | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| | idx | [UINT16] | L2CAP connection oriented channel identifier | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| **l2cap-send** | | | Send data over connected L2CAP channel | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| | idx | [UINT16] | L2CAP connection oriented channel identifier | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| | bytes | [UINT16] | Number of bytes to send (hardcoded data pattern) | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ +| **l2cap-show-coc** | | | Show connected L2CAP channels | ++---------------------------+-----------------+----------------------------+----------------------------------------------------+ + +Keys storage +------------ + ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| **Command** | **Parmeters** | \*\* Possible values\*\* | **Description** | ++=====================+=================+============================+====================================================+ +| **keystore-add** | | | Add keys to storage | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | type | msec | Master Key | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | | ssec | Slave Key | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | | cccd | Client Characteristic Configuration Descriptor | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | addr | XX:XX:XX:XX:XX:XX | Device address | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | addr\_type | ``public`` | Device address type | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | | random | Use random address for scan requests | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | ediv | [UINT16] | EDIV for LTK to add | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | rand | [UINT64] | Rand for LTK | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | ltk | XX:XX:XX... | LTK (16 bytes) | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | irk | XX:XX:XX... | Identity Resolving Key (16 bytes) | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | csrk | XX:XX:XX... | Connection Signature Resolving Key (16 bytes) | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| **keystore-del** | | | Delete keys from storage | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | type | msec | Master Key | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | | ssec | Slave Key | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | | cccd | Client Characteristic Configuration Descriptor | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | addr | XX:XX:XX:XX:XX:XX | Device address | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | addr\_type | ``public`` | Device address type | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | | random | Use random address for scan requests | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | ediv | [UINT16] | EDIV for LTK to remove | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | rand | [UINT64] | Rand for LTK | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| **keystore-show** | | | Show stored keys | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | type | msec | Master Keys | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | | ssec | Slave Keys | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ +| | | cccd | Client Characteristic Configuration Descriptor s | ++---------------------+-----------------+----------------------------+----------------------------------------------------+ diff --git a/docs/btshell/btshell_GATT.rst b/docs/btshell/btshell_GATT.rst new file mode 100644 index 000000000..0fe465fe5 --- /dev/null +++ b/docs/btshell/btshell_GATT.rst @@ -0,0 +1,108 @@ +GATT feature API for btshell +============================ + +GATT(GENERIC ATTRIBUTE PROFILE) describes a service framework using the Attribute Protocol for discovering services, +and for reading and writing characteristic values on a peer device. There are 11 features defined in the GATT Profile, +and each of the features is mapped to procedures and sub-procedures: + +Available commands +~~~~~~~~~~~~~~~~~~ + +Parameters default values (if applicable) are marked red. + +Configuration +------------- + ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **Command** | **Parmeters** | \*\* Possible values\*\* | **Description** | ++====================================+=================+============================+===========================================================+ +| **gatt-discover-characteristic** | | | Discover GATT characteristics | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | uuid | [UINT16] | Characteristic UUID | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | start | [UINT16] | Discovery start handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | end | [UINT16] | Discovery end handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-discover-descriptor** | | | Discover GATT descriptors | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | start | [UINT16] | Discovery start handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | end | [UINT16] | Discovery end handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-discover-service** | | | Discover services | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | uuid16 | [UINT16] | Service UUID | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-discover-full** | | | Discover services, characteristic and descriptors | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-find-included-services** | | | Find included services | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | start | [UINT16] | Discovery start handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | end | [UINT16] | Discovery end handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-exchange-mtu** | | | Initiate ATT MTU exchange procedure | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-read** | | | Read attribute | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | long | [``0``-1] | Long read | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | attr | [UINT16] | Attribute handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | offset | [UINT16] | Long read offset value | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | uuid | [UINT16] | Characteristic UUID | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | start | [UINT16] | Discovery start handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | end | [UINT16] | Discovery end handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-notify** | | | Send notification or indication to all subscribed peers | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | attr | [UINT16] | Attribute handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-service-changed** | | | Send Services Changed notification | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | start | [UINT16] | Start handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | end | [UINT16] | End handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-service-visibility** | | | Set service visibility | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | handle | [UINT16] | Service handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | visibility | [``0``-1] | Service visibility | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-show** | | | Show remote devices discovered databases structure | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-show-local** | | | Show local database structure | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| **gatt-write** | | | Write attribute | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | conn | [UINT16] | Connection handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | no\_rsp | [``0``-1] | Use Write Without Response | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | long | [``0``-1] | Use Long Write procedure | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | attr | [UINT16] | Attribute handle | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | offset | [UINT16] | Long write offset value | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ +| | value | XX:XX:XX... | Data to write | ++------------------------------------+-----------------+----------------------------+-----------------------------------------------------------+ diff --git a/docs/btshell/btshell_advdata.rst b/docs/btshell/btshell_advdata.rst new file mode 100644 index 000000000..eabfcb3b8 --- /dev/null +++ b/docs/btshell/btshell_advdata.rst @@ -0,0 +1,47 @@ +Advertisement Data Fields +------------------------- + +This part defines the advertisement data fields used in the ``btshell`` app. For a complete list of all data types and +formats used for Extended Inquiry Response (EIR), Advertising Data (AD), and OOB data blocks, refer to the Supplement +to the Bluetooth Core Specification, CSSv6, available for download +`here `__. + ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| **Name** | **Definition** | **Details** | **btshell Notes** | ++===========================+=====================================================+===========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+==============================================+ +| flags | Indicates basic information about the advertiser. | Flags used over the LE physical channel are: \* Limited Discoverable Mode \* General Discoverable Mode \* BR/EDR Not Supported \* Simultaneous LE and BR/EDR to Same Device Capable (Controller) \* Simultaneous LE and BR/EDR to Same Device Capable (Host) | NimBLE will auto-calculate if set to 0. | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| uuid16 | 16-bit Bluetooth Service UUIDs | Indicates the Service UUID list is incomplete i.e. more 16-bit Service UUIDs available. 16 bit UUIDs shall only be used if they are assigned by the Bluetooth SIG. | Set repeatedly for multiple service UUIDs. | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| uuid16\_is\_complete | 16-bit Bluetooth Service UUIDs | Indicates the Service UUID list is complete. 16 bit UUIDs shall only be used if they are assigned by the Bluetooth SIG. | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| uuid32 | 32-bit Bluetooth Service UUIDs | Indicates the Service UUID list is incomplete i.e. more 32-bit Service UUIDs available. 32 bit UUIDs shall only be used if they are assigned by the Bluetooth SIG. | Set repeatedly for multiple service UUIDs. | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| uuid32\_is\_complete | 32-bit Bluetooth Service UUIDs | Indicates the Service UUID list is complete. 32 bit UUIDs shall only be used if they are assigned by the Bluetooth SIG. | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| uuid128 | Global 128-bit Service UUIDs | More 128-bit Service UUIDs available. | Set repeatedly for multiple service UUIDs. | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| uuid128\_is\_complete | Global 128-bit Service UUIDs | Complete list of 128-bit Service UUIDs | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| tx\_power\_level | TX Power Level | Indicates the transmitted power level of the packet containing the data type. The TX Power Level data type may be used to calculate path loss on a received packet using the following equation: pathloss = Tx Power Level – RSSI where “RSSI” is the received signal strength, in dBm, of the packet received. | NimBLE will auto-calculate if set to -128. | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| slave\_interval\_range | Slave Connection Interval Range | Contains the Peripheral’s preferred connection interval range, for all logical connections. Size: 4 Octets . The first 2 octets defines the minimum value for the connection interval in the following manner: connIntervalmin = Conn\_Interval\_Min \* 1.25 ms Conn\_Interval\_Min range: 0x0006 to 0x0C80 Value of 0xFFFF indicates no specific minimum. The other 2 octets defines the maximum value for the connection interval in the following manner: connIntervalmax = Conn\_Interval\_Max \* 1.25 ms Conn\_Interval\_Max range: 0x0006 to 0x0C80 Conn\_Interval\_Max shall be equal to or greater than the Conn\_Interval\_Min. Value of 0xFFFF indicates no specific maximum. | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| service\_data\_uuid16 | Service Data - 16 bit UUID | Size: 2 or more octets The first 2 octets contain the 16 bit Service UUID followed by additional service data | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| public\_target\_address | Public Target Address | Defines the address of one or more intended recipients of an advertisement when one or more devices were bonded using a public address. This data type shall exist only once. It may be sent in either the Advertising or Scan Response data, but not both. | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| appearance | Appearance | Defines the external appearance of the device. The Appearance data type shall exist only once. It may be sent in either the Advertising or Scan Response data, but not both. | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| advertising\_interval | Advertising Interval | Contains the advInterval value as defined in the Core specification, Volume 6, Part B, Section 4.4.2.2. | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| service\_data\_uuid32 | Service Data - 32 bit UUID | Size: 4 or more octets The first 4 octets contain the 32 bit Service UUID followed by additional service data | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| service\_data\_uuid128 | Service Data - 128 bit UUID | Size: 16 or more octets The first 16 octets contain the 128 bit Service UUID followed by additional service data | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| uri | Uniform Resource Identifier (URI) | Scheme name string and URI as a UTF-8 string | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| mfg\_data | Manufacturer Specific data | Size: 2 or more octets The first 2 octets contain the Company Identifier Code followed by additional manufacturer specific data | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| eddystone\_url | | | | ++---------------------------+-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+ diff --git a/docs/btshell/btshell_api.rst b/docs/btshell/btshell_api.rst new file mode 100644 index 000000000..49605bf41 --- /dev/null +++ b/docs/btshell/btshell_api.rst @@ -0,0 +1,153 @@ +API for btshell app +------------------- + +"btshell" is one of the sample applications that come with Mynewt. It is a shell application which provides a basic +interface to the host-side of the BLE stack. "btshell" includes all the possible roles (Central/Peripheral) and they may +be run simultaneously. You can run btshell on a board and issue commands that make it behave as a central or a peripheral +with different peers. + +**btshell** is a new application that uses shell subsystem introduced in Mynewt 1.1 and has updated commands and +parameters names. Thanks to support for tab completion commands names are more descriptive and self-explanatory +without requiring extensive typing. + +Highlighted below are some of the ways you can use the API to establish connections and discover services and +characteristics from peer devices. For descriptions of the full API, go to the next sections on +:doc:`btshell_GAP` and :doc:`btshell_GATT`. + +.. contents:: + :local: + :depth: 2 + +.. toctree:: + :hidden: + :titlesonly: + + GAP + GATT + btshell_advdata + +Set device address. +~~~~~~~~~~~~~~~~~~~ + +On startup, btshell has the following identity address configuration: + +- Public address: None +- Random address: None + +The below ``set`` commands can be used to change the address configuration: + +:: + + set addr_type=public addr= + set addr_type=random addr= + +For example: + +:: + + set addr_type=public addr=01:02:03:04:05:06 + set addr_type=random addr=c1:aa:bb:cc:dd:ee + +The address configuration can be viewed with the ``gatt-show-addr`` command, as follows: + +:: + + gatt-show-addr + public_id_addr=01:02:03:04:05:06 random_id_addr=c1:aa:bb:cc:dd:ee + +Initiate a direct connection to a device +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In this case, your board is acting as a central and initiating a connection with another BLE device. The example +assumes you know the address of the peer, either by scanning for available peers or because you have set up the peer +yourself. + +.. code-block:: none + :emphasize-lines: 1 + + connect peer_addr=d4:f5:13:53:d2:43 + connection established; handle=1 our_ota_addr_type=0 our_ota_addr=0a:0b:0c:0d:0e:0f out_id_addr_type=0 our_id_addr=0a:0b:0c:0d:0e:0f peer_addr_type=0 peer_addr=43:d2:53:13:f5:d4 conn_itvl=40 conn_latency=0 supervision_timeout=256 encrypted=0 authenticated=0 bonded=0 + +The ``handle=1`` in the output indicates that it is connection-1. + +Configure advertisements to include device name +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In this case, your board is acting as a peripheral. + +With Extended Advertising enabled (should be executed after advertise-configure): + +:: + + advertise-set-adv-data name= + +With Extended Advertising disabled: + +:: + + set-adv-data name= + +Begin sending undirected general advertisements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In this case, your board is acting as a peripheral. + +With Extended Advertising enabled: + +:: + + advertise-configure connectable=1 legacy=1 scannable=1 + advertise-start + +With Extended Advertising disabled: + +:: + + advertise conn=und discov=gen + +Show established connections. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + gatt-show-conn + +Discover and display peer's services, characteristics, and descriptors. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is how you discover and then display the services of the peer you established earlier across connection-1. + +.. code-block:: none + :emphasize-lines: 1,2 + + gatt-discover-full conn=1 + gatt-show + [ts=132425ssb, mod=64 level=2] CONNECTION: handle=1 addr=d4:f5:13:53:d2:43 + [ts=132428ssb, mod=64 level=2] start=1 end=5 uuid=0x1800 + [ts=132433ssb, mod=64 level=2] start=6 end=16 uuid=0x1808 + [ts=132437ssb, mod=64 level=2] start=17 end=31 uuid=0x180a + [ts=132441ssb, mod=64 level=2] start=32 end=65535 uuid=00000000-0000-1000-1000000000000000 + + +Read an attribute belonging to the peer +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + gatt-read conn=1 attr=21 + +Write to an attribute belonging to the peer +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + gatt-write conn=1 attr=3 value=0x01:0x02:0x03 + +Perform a passive scan +~~~~~~~~~~~~~~~~~~~~~~ + +This is how you tell your board to listen to all advertisements around it. The duration is specified in ms. + +:: + + scan duration=1000 passive=1 filter=no_wl diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..4e20d472b --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +# +# Mynewt documentation build configuration file, created by +# sphinx-quickstart on Tue Jan 10 11:33:44 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('_ext')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', 'breathe', 'sphinx.ext.todo', + 'sphinx.ext.extlinks' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = [] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Mynewt' +copyright = u'Copyright © 2017 The Apache Software Foundation, Licensed under the Apache License, Version 2.0 Apache and the Apache feather logo are trademarks of The Apache Software Foundation.' +author = u'The Apache Software Foundation' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'1.0' +# The full version, including alpha/beta/rc tags. +release = u'1.0.0-b1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', 'themes'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +highlight_language = 'none' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# + +html_theme = 'alabaster' +html_theme_path = [] +html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', + 'searchbox.html', + 'donate.html', + ] +} + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +html_theme_options = { +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Mynewtdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'Mynewt.tex', u'Mynewt Documentation', + u'The Apache Software Foundation', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'mynewt', u'Mynewt Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Mynewt', u'Mynewt Documentation', + author, 'Mynewt', 'One line description of project.', + 'Miscellaneous'), +] + +breathe_projects = { + "mynewt": "_build/xml" +} +breathe_default_project = "mynewt" +breathe_domain_by_extension = { + "h" : "c", +} diff --git a/docs/mesh/index.rst b/docs/mesh/index.rst new file mode 100644 index 000000000..6ad75363f --- /dev/null +++ b/docs/mesh/index.rst @@ -0,0 +1,95 @@ +Bluetooth Mesh +-------------- + +.. toctree:: + :hidden: + :titlesonly: + + sample + +.. contents:: + :local: + :depth: 2 + +Introduction to Mesh +~~~~~~~~~~~~~~~~~~~~ + +Bluetooth Mesh is a new standard from Bluetooth SIG that was released in 2017. It enables many-to-many device +communication (as opposed to point-to-point approach in BLE) and is optimised for large-scale networks like building +automation or sensors network. It utilizes managed flood based approach where only mains-powered nodes relay messages +making it very power efficient (battery powered low-power nodes that don't relay messages can operate in mesh network for years). + +Bluetooth Mesh is complementary to Bluetooth specification and requires features from 4.0 release only. This allows +deployment of networks using hardware already available on the market. + +Topology +~~~~~~~~ + +.. figure:: mesh_topology.jpg + :alt: Bluetooth Mesh Topology (source: Mesh Profile Specification 1.0) + +Bluetooth Mesh defines few features (roles) for devices in network. Those are: + +- Relay - receive and retransmit mesh messages over the advertising bearer to enable larger networks +- Proxy - receive and retransmit mesh messages between GATT and advertising bearers. +- Low Power - operate within a mesh network at significantly reduced receiver duty cycles only in conjunction with a + node supporting the Friend feature +- Friend - the ability to help a node supporting the Low Power feature to operate by storing messages destined for those nodes + +Bearers +~~~~~~~ + +Mesh Profile specification allows two kinds of bearers for transmitting data: + +- Advertising Bearer + + - Uses LE advertising to broadcast messages to all nodes that are listening at this time + - Uses non-connectable advertising only + - 29 octets of network message + +- GATT Bearer + + - Uses LE Connections to send messages + - Uses standard GATT service (one for Provisioning and one for Proxy) + +Provisioning +~~~~~~~~~~~~ + +Provisioning is a process of adding an unprovisioned device to a mesh network managed by a Provisioner. A Provisioner +provides the unprovisioned device with provisioning data that allows it to become a mesh node (network key, current IV +index and unicast address). A Provisioner is typically a smart phone or other mobile computing device. + +Models +~~~~~~ + +Models define basic functionality of nodes on a mesh network. Mesh Profile Specification defines foundation models used +to configure and manage network. Mesh Model Specification includes models defininig functionality that is standard +across device types. Those consists of: + +- Generics - root models + + - On/Off + - Level + - Battery Server + - Location + - Client Property + - and others + +- Sensors - defines a standard way of interfacing with sensors +- Time and Scenes - defines a set of functionalities related to time and saved states on devices +- Lighting - defines a set functionalities related to lighting control + +Complex models e.g. Lighting may contain other models eg Generic On/Off. The following image shows an example of Light +Lightness Server Model. + +.. figure:: mesh_lightning_model.jpg + :alt: Light Lightness Server model (source: Mesh Model Specification 1.0) + +Mesh Node features supported by Apache Mynewt +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Advertising and GATT bearers +- PB-GATT and PB-ADV provisioning +- Foundation Models (server role) +- Relay support +- GATT Proxy diff --git a/docs/mesh/mesh_lightning_model.jpg b/docs/mesh/mesh_lightning_model.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c62e057b1d5bc3edb0b27e7ea72ec9d9241ac33 GIT binary patch literal 120157 zcmeFZ1z1(v)-b$jR6>+)1?iFofek8s=x&q-0qGJpf`A~6fRfTkigZh-ba!`1!)C|7 zJolb^;r#cU``+(+-v4?3?>qV|U32ZV<{V?pF-OmdoIoysZp%r@N`X*NP(a4OUl4K{ z^aO;BiHU`YfsKWQb>jy1O&mg8oLjeW$nM<5C!`{$p{63Iq@<B*4tZ z^^ljBmxfVDRFGSQgNK*%Ida_v@%MY`VuKO+>1LKj?X$JNn(YNlZdYM*e_-k%^gwmycgS zP)PX6Q%Nal8Cf|sbq!4|Z5>?`Q!{f5ODk(9XBSsDcMnhhHvxe`Z-YakW8TNc#eevi zke-p5m7SCOIqz#}S$RceRdr2sOKV$uM`u^}(D2CU*!aZc)Z)_e%Iezs#^%<+;nDHQ z>Dl=O^e0{@Ahf@s^$*N`hZg~W7b-eB8amcbyiicxfD4TP9pm0Z%sUb)SkD~p-sgUe zP53w}t)%G&9gpe{qUVl-H;L(a7att_MD171{%eT&{V!qm55)e7*Axf`4F#AyGy)J9 zbOsGvIvg8duC5NeJ@4GT=yd#DK|eLvIB>ZYD*XM9O#0A{?-q97hN$ITfyRomV(5)Y zBxwEw2_gqyYpp{{Ux3%Urx9?@a}{{vGbBh%bN*}-((F63@z-~M(d93G`D;D=lp24@ ziNECMU;5#nTJ*2=@Yj0y^Yu`JO?%rB|1oRONZB+&)@+oSJt7MUT8&16oG-O>G9aD! zN=Q(#B@%Q@AkI2dD@mx#Rbm%6qyLy16H#a(96}LTIk0J2KyxmA+<$Rq ze+fl`mZf2IPz%^)B^(YpC_sFv#p|6*{{mU083wP4Is zz|mxGuc8gU_V8MVVn$G7kfz@~ zhBSk-A^o+G`EfvpiG8WX_*gG#j09bM3cf}FZ3Dl*sPfZG_=_rk@ygGI_16meZ<8yM z_9pf@=W%Ve8p}HD>vJOQ_r92PpkF5Bj;XqSNggcyj0APE93iT}2tS*Q!NwJ=93*JG z3N)pENEOl` z>h=JY!^HI5%)kgCUJ2-$eMW?z^)37htZB&j1H|K;Q6y;P76b`0JcMj8eEI^6t6CcWQ(@V5^C4i@WBtrVtg+x6>R$nX@^Dans?6TBUT%H${$pOyl7uZdQ z4C-j(Zs*N*ynN@}L!e3#8YsB3&ii$LHnPjrP`^(5lzBkKS^Nr=$gj0J4Zr|JZ4N7t= z&IcwWtrS)q83CrL3c=|X67lbsBO&#nM`K0jdutSrkRZI789|xn^>aJY;tyk_Srj<8 z9gZr=z}qHyBOEE+?Rsw)?{cHO;b!w#zx?hCCRg*ar-?4@C*+nxQTM=(eYo8otCQYGc*~L&Wvn}jhl*sYvOogw^IQpRKMbw1J=hI@| zVfOUe;a6n#!a%onX!kZ++@9>J&1p9gMT8X^S4!aAk)&72J0RqAL<_NcEh&XyS_Tx3F2_}|CpzH-n;v*RJKLGrh}orBdso65jPT$CN!@NS+W zD!;H4jUy_mw+RgN`cYEImZI+^b%x(O*kfkjx3wEhm|7!?^*IO^|K{yr=!TITIwk#< zbn5^f{){wg=SA}Ku%<0gr`S2ns^&$-P|xQ{nHQ!3WvBSLo6299s@uu1(9f1)!dF=m zsl)8OtXz95&Xjw*&fYj;(rt%i6xxhInJT3Nz23cxW5&77vF0d@AnI^ewS0C!65H2%e zwG}zkI{xldeb{VrFD;Ms%MYERP3Zo*x96s2cnV0ky4CjIMDouU32P;1XXF`7Z6~-U zfBv37nH6QZ_lvvBtI+KIrAJN*KkE30tc71yKm*dESsCw0*jRSH)XFSOGNmyr6Wo|T z8HWXshi^g*z`e&3xfAgkByp>Wdl7t&9vzg>k#@^B&3EtLkeRvtrHi_%m~Y4#o70Dk zulF|X2!H+Jv*$5N<1h)kh_&+csc9z41(0dSk^&xoV8 z?MW$6QHisS(aZh*a*-alay$HeiNUnu<-Mv9sp(p4K}NE6_uYh}h+8eT3>i5+_PM%b z_rE&O6IX-=VR*_-wo9CB>owxNC`|uRUqAKDZ%uV^b^7Qw<$}fV>oz>%#*=wi5P7)f z5fbEU-Lv$L^pz5|-zHbJ3x?^p$xeElb)n^<*jGx=5sbp9neCfe4lgmA4)@xfl9s2c z@d=vf+>15qeD8_|)Ys3rBSFuq;XKNlFJ~GWv*&#^k5npaYshxAU-=)RzKJac3|^3; z<60%a*Zvn7L&VU*B89KB;&xctZ~R}vghy?aw91Fs?H)wSOld#2dKJNiWsK=gwB`U0 zfIZBfoO+5Ctoefk<)LuHa&$-0!;li6DQEkojdJbLa>mH=isPR5O;gIJXpQA~#E5!u zFOeP~QETBH>C@JyrB<4iNAgrMJ^Iq8!J&?%3E=n3Xt;f% zEY&0e{je?#BhH><=`0mVqNo8v6-m$^U5@>bynb)b`wcSBL!8KIeFZ>x>)Z0{+cd|7 zMlej>aQt)lNaHqOiAUxW?GCo6#`4a1Qd8+mYN%v!Wcv7&AVCt6NYFR4jQ%n322tt*cRE}$K73=$*=B`yN2jRbv4M}ii(N8YQP=z_axbPHjv{}KW< z>G~Mup{42%Om1x0Dz94z;4DO=iy;hbhl;z7KiY$-Nh3W`QYN<5PCRM4!3A0f6Y1Ze zFZ1}vh$Z$S;(oMaOOlp*8G&Z*2xE#|w6Uz31N4_VhH@3d!MpDthDbIwZMcgvdr^wj z;7^YuOtk(*KWTBB@$zxICQRFR1$8j7X)U7UO&;lQj-BCwJnn1R)^kf)Hxx?Ssrr=a zj;}rV2brkc0=fI)%zHFFccO0EP35G4jTFnq z#%$mEcgou7TK2yEQlvOIvrf8}I=bOXGRBGo@o@Z0phg+SjNzT(6v3vkx86pJa4El( z#Ufn~skC>DC+-o(RDYHv980%_OQZD(iZ#Z{S=RB-X}ZD~W0K{4g?SREJvz3w3(sGD zSP4!}vdF*PLUu}ITTWbFUU_NC#228R2bYdYA4_dd{zfJdN!#joDgUJQKRG$x zrMQDAPoD7ZBY2vzd-t=*Xm0G2rsc8nkv-)JIyym7$y@jmySLp#dOUFc)x3RX%7Yft ztdjhHu@D%QM+=K~U_C1dLUwl;pMdlO1-EcrG&&6-#lwx;r!?@JHPEAnWy?3Rh)jl? z)ZZ`6BsZ6?0HK9cK%^IYMXXa`{~7kL_y3$K=B{4ZIc2CXL?gOY?e ztnmj}urOUP++!9A+ECU~(QkYUUa=lTg0}nik)X$ZfeaddWNWf`|7+v4x`Ya|l1Y(I(zmgMC^eq7+%Lw%mcCw7aS=#q6%z)sGAIcd~i6pA^ssfK< z<&g8n3tPg1hd3OHvU{>;-}UI|u(Al%?4Vy{ADG_HOAk;6QGp0EO^uJ!L!J<5Xt?J2 zHuyToynV|Rk|zpk6Al4cr!%SARD2ZTP@`o2ZICVxD?0Pz{;?dO$8 zU*5{3CF@fXbv20|j8#A?c~k!xG!9u-8z@?OsBbtSPwiB``k3cpOfxJtW&Q`av$l4} zqyu9V4&N?p7&CZ0J1KyZmlwLSPS!3+^gcegq-*|> z8C*v-{S}3dZk&pl_nl2*@NUtow6Bl0<0At}_5B1-*27si{V&|eUWRXbQZ1C|q zsWFe7P2HLU+k+W797tuU8!{?;b-u z&cGd>flevB;&r6jlf&kE8kNlALeTD7pVhyA@42ItEP6!iSp4Z)3}D|p0$(B;m!+>Z z6xykfpnHY}p`})?r(=!wU#nA0HQU3an!XC6s^J~_* zAE(41E8l|Aq^05G%P-~ddak1J8i#?ewe-L2iCMXFXANgv-iX5$GmY7G_(fITpFWx; zs*9}^Eqt;lOx9GBMLjBsIz1N&vaIU~|0ixwvM*6%7$pN!_$wc+Lbwd=LZ)H|-UgCc$TB}R)Qnc(o8J#zK!Tt*iXxp#Bz5tcBalbZr%K(trq*|Oy_!s0rnC7S!kY=BX(tj6;!TBXW9|-IaBSDCIKm!jb zNB~6_w3qhKmBvnWXd~>kJ)j`x04k3V(;VVgAVEd)umGp$!nk(Y=^?Biz5rwV)C~Wd z*XPe$al(9|@ik#1nqz~ZrJWAvcq>qpu1~jIA`09Sl?JoJM|>q4$l{Iih6z=Lv5GJ@Bi#hx8c@T@HMf|eZ1!r|Eeg6QLzQF26 zyJy=BtC-RS+3`H|tP0^U_B+{?XGBg}!RrFPz%Yc2WBrsP&Yl7=-(x^Dokjp^i>S{U za(J^25Fhw}oK4s`w!c6DRO`tu4Z@GLDkW=*DgAZ8@6(H0zq8quTf1xiKq4vqp%ByJ zr~5Rv8p4!b{q81Hy6^wibpv!q5wx%E*%(|_uvC4bV>sOGTC&B> zJpBMxpxJlV&*yyY$?&R@VS0g8!(Bg$)loj1&wRETKC5ltnx726&7fg}I6HEC9(}iK zLf0ISMkkX4@ z(8|Yn+%tRq?*8#NbYCT^AFNUhenCGnHeT&QmgGm6(nCf%fqy{1U4e636d6nbXCA7g z^L|_{xjFQ;t5N*IJG6FY-(H0N@ETJLX0u|*rIu7X-4tY`3NWAR?9Ve0KNOf;ZKwq`&&0?4L-JTIgp{uZ7PgQ{}eRZOkz6ty57&T%Px4W-H*Q#da1V0I%)Zx9# ztO&YMd!Ji-1z$lkbfc7M~ROke{>o;4h!n6K-54!4z{r< z-ITwJ88*WGWe=BoY>Q&rB?W7q!U7B3Sy0p`R=(vxn)vl|I(^Il(xZ_`9%XlH%lOBY zYWFc`V8mpXYvqmg&)KuSTV@?Sp$bpbF7B)9dlX@9HaeqeLl7?*EgAfh=ZHGC7l^NA zS#wRzl=9Wi%@RNEz|q?ChaM=`S#CO@%I#v0E=fM>V&M|Rn$9xKtB9?c238991gE(YDVvDV!nD_XwU+TOP{){`8Yf})ph~Z5nGEmdjC0s#J{~)m zda8N9!;-#I@FZuK>J(897=wcJjm4Zt!osYfuh7-i_sjN1@oM~5`QX)?9_~!h{B|aj+z}t}| zb^CZ93J(He07VUTp)KccPY(BA|4zRB-({OceN>Tuc=MBK^h;0yPoe%+=<|VlvL<~L z${%R%L1sF*Q?p6nMI%F1q>#HXQxW#XBaDI%Bl{9EFFnE_!9e24f98^W89}i<)e%zG zv>22B4!dCKLC#zAEz96<>L$&${c|hu88^Op{a2y`E{`HAY#ikCjBcYTiS*WavM}Gw z6I#IUJ<>XE#B%qNtko-gBwJZoCH}bc(;g_4TDFidJ;N@Y!-||CIc=Jk+~sR4)w|A> zI1kdKI9DMy50MyMLKU5###z^Bol^QnG@EW<8jf1Ea@=-&Y$YX*RJBRW29w++N};4< zi|zqOam0@IjTf|nVCyl`w95%&+FvRarIyMd&BT1SDOwZC*S@&-qF)ft@Grc|YXhomH$gUip5@o8XrYqHGDQC7ySS&i)-((&w@g^QC2QgMrZ zZu}7j#J?q|o*)p#NYGuwED;yMCdr(%m62~F?`L9kV{`Mt*IxmOa8w`z(#n9F1!&M# zAOL2mw$q8|&z~jwckd3u)09f_ccAryx*>p@hCO0*OfUl82R!QoAWhFl0!MejzXUu8 z1)3?sORoR0%NT~JYy~=5j%3Tjhdn&vnK63~vfkMpPF8Hn1q8eS^27lKMpS5c%aoqs zqX4RZJh;+$?$nqGG|XC2!=g#hl$iv4w#v=Bkp_PpwEO^hPZPPz&>3baw_j~C?v zS-4TQcs8}bi{$SRe!@X;xDkRO;#>-_(m#c#0kIw}Bq%t$WF)%$g9wJ!D534HaoM}> z%7FV3LR0=|eEODC+L1E6(_9NHT(6x{^_R*U|E!~o?c-W5Xn^5H+X!z~O@JyC1q;$AH1c?3!PQG z^gMnEl%X@ZzvHM*)wAI(%@BR-kS>#$rBRLI}}Swej{>25ac#)(B(qr0e)Np@-J_! zIic8FG-oG}^8~R*`BIV*mNO}h_Lv-l@9X;7(>;u5b6m2}k(dcx1F5KfTf(=g4mv2e zj*kmzem8eOwb#|2p(oTW&;YwNn+csRoR{?l3`}pC5-|xc@kY%H{%d5>O#ky2rB4II zdcmbzXOh+|{eMm#2(a>6F2#zS|2z6Lo4XQvZ;NQr>~g^Ack|$kp^eg%#hh))e#vTG z<)D$FDcic=JQ&MVPJ1;Np-Ys?2n&VU!@Xu8g4^UkH2%T=*l0YEWbD;ekt78DXP4Rt zpS&msQS_d1V&B97YCj#sMcuJu;wGqCM{8<_|BRt~h_PYhVQQ&FL?m^<#1H@Nt{q&> z!xL}&kD&<)uaTfQ%a&d4h|>=aq^J6oHOGZ|RAR#l6~w2Sn>ga@*5R2a^e6OZj4?`2 zF?Bbbwq7udugM2sv6|pX)GiP1|U zW)a0LyDAiR%J2GRD`&>MZhT3gwX>`iYxwxanAfC)4oCWNkNWJ(7Up09Y~PqT?CY<9SO3S z)ZY?*A2T`KjRe^|tC5L~keCUHxugLqFF(2Dz|W0-6h9`#68!9B=P}%o+tm?oQgmd3 z1f>8riT6#B2_$Ge9Wwv8nr6qF2l09=^=uK+3~2v<+~;2kAwdtpQ>+(|yZ_OL5j*R! zCU|;d{DJU3KloxJ^=u&Hdj!Ih5q``Xh3FUtZ%|nwK|Ulfrt6J9NH5L59S!mm%*ah) z-Or3lr65PyfS*ABZM^r}u-}l1`1`m;63)rY@3}Wm&15?76E(q^gf*in?|u0?BlY-# zIU39YE=@hcIt@Xn75{t6gmD5?`gQo<2K-kDMtZZ#hRKTtMCWe(!UTddLrRYOp;$V= z{;mKd=;lAh`yW=S z{*Iwh>vrA$i#pO*nI+?T1DJd+h-L9A?B5S)IdmNNJpY-g%oaLx$ENhD6T%oVXw>aW z{Q`0{2;NVVPNabyD_w4A(ZM6KAp^q02-wdJZCCG;kf0CXGOa@dqrq=1PUrztF!Vn~ zf*JxG!4psmI9efiABYtO&|GUw_Fwp4NfzfH@wJn&xC)Rz{~W?{r)6@oSSu!VfDgt>yJZFNh3g+A(00X zq)!7F(0qd%^M`1|K;(N03`f^;5S1@ekwm+>3X=fh^_metjNJ_aB_ta8U2r`uIMxMn zfjSRVIo1Jrwp=#w3XLt$W&Fj>RKRkKWJiMFUR^)qUw$nJiPQO$E=Xk23u%eM9-tt` ziCCq6bm#aYBXBY6h+eh3MEsBv2h~T}VZ@qQ$u(c*MUppk9^RLu7W6i6(aRA6-0?TP+D)ZkN-ag zUW`Q6Y467q`g)Ie%|1GIs{7qQzb#G|Y29Xe?uC#zf{d?rAi}K2igR-~EScRzDhhUh z8CJ&N)-my8h||(umZ(ndLyb_i;n+8ntoEYf#~k4t4+`gRehS&lI9AGG-@uh7esdOG z*jFn&*O}v}$Ff`b_OzL%LHaCFtjTJ+3I{P(KPIMt_dwocT&4QSY7`Rm%dkJ=c)&4Z zmj3Xuyxxt3%>?=UbyBZd|C-05SY}42>L|OKoaL-k+yv|=GyEHhC{fLOV*VqSH@_pM z8XA^mhs>QtIqaS6X%;d`z-OIUV=49McAB=QjoF(=@D#n|v!|wd;@LV%Fcb;Fvv!u^ z(+9g}!VQJId7jggYjd2fe)@pK*A|P-G0D-fiuB;;kDTsEiVa3xfhM_#9hZ@PJgxTv z+{_4hQs)UJSb2k(Y3dsphl?txY6Q--{%vS^TYE0tb>_=q(9i=EFqcxj?V#i(Xe5j- zRO)R$c_@a8FIF}S#&Ch=s-0%{jAHdPQ?MIOC?%yumQH#k2BESdrji_psbD&lz_LQ2 zVqL2QQ2JG8H%Z}`P8xv6#5|me5Y1?;5pC!<;bBICUfWJXhfC3{L)s9NBiR64_IQTN zrTX$X^3X>Do6;YbtZMW&`Ta+;qn$1=l-4DEr_xIxr7m5KDll}FNriHC0q(Pd zED}WHnNsMqU30R8_2ZpodQTO_9hsFy{BMV3?$^#X#bv!L*s0P9C8=|qUf%s z9c4$R+ybg5syH3p-tfLHUE|k;Ax*Pz4VE^1S}zUl<3J757}fd&{>K6I%%KF~-K;{4 zZg%;wZUrmIwuxB#Ar$s@A?1;a-xwpyee_3P*Qt9ttP5>K=d!#q`q$aidaRh;)Ujx| zkFi2ZopR(YUZxLG43kx8>wJn9>8kW4CK6-d5S%%4;=VSE24-zY< zsEVlTu94~S%HJ;jLT9k+JVK4>B5|~f>nD9&2qu7Z1T@0Ef96v|yfz}=qYABsjja}G zv=2R@TycCDZrzvhj5_NDZL};M%4my}xUod%7It<9hk@Jh@m*^uL@#oCxV$3RiJOIo zi4-p_NM&No`3xEw2hEzTZ&_V(&2J2sxA${TNjqySM2dq`H}za=Ubqf>Tz=>tpl9zV)jtFa`?234 z#f=K|h@4`*pZb1ZQ;7CpcbZ7?&gS|>2{Y&RKwrg(3*EEq`5wnm4o2-10#Y>esHBsA zh+J5C{-);A8rmb$Y}4>bw&c-KMLc~@wSFH~GiNX7FXg59obk5zJA>%x{i9NtgQRZJ zr)aG9a>+A(_|YzoQIkYzN4D=T&31_d=|Y-lc;!gQV`sF6fI8!^N?h3JaTmek5q0ng z!)3xs;jkIuH$4u{F9u}LDR$4E+&>t-q^@sgIq8cyO%)cXufF8%;FgG`h5E{LQhytC z$hh^IO~K2NJzL0~JCnxv*M~jeZ78A^V;K%H8h7l=uxFo3bU?pzq1r{J0eNhLO8R0a zr|i-^^H9y+TcAM1!-sZElvQL;kB(O;azW2S!oS(-N_>iOU- zdl;1xLP9I`qzTxfao2!43@8i`1taQ#T^s|FP6??nzhdyVKTvGIP$No#5ch<@y`%x- zCS;HCvug;`r)R$}u&W9AodHGokh=&7KhXlY66jgXPrC~v2Mh#gRlB|2vgDXUcLDXvcjJQd`fU!mhYPNKm}pKJfiMr z9m7z;c-v`@n+sn#Sq z=|sZk!#wPgVoIfTqrHfk3NB}#kB$G5awRP~D3l9L3C8VW@5;@y@+r>m$=P|7 z5n#@lg8f_yELW|l;xOnJ?M2{z)dnh1AYZ$sK)toJX1N&ns5bggrb$COVJ6y!dcWO5 zxynYA!o35R`&M!FK;96z=@&)I{@JG9*+wqyJ0$8;mXx`H-LO3D$hRTj?wN=69z;t11 zkn;tni6Y64Lx8W>Md2H`R)xn-Jch|EEUXZVZ z^7Zzb#WobRRxT!K#yW0WEPK^T%O{&i4X-f(DrO~0phq(reFy_wb(R)UO^5wV) zv0FYb$3mR{f+#DTeLbRSyZ+W$LCgequOw$$4(w<1UJ4dm@Y#pv+;w*;8Zo!69L-sC zR#~cW5%|g{_OsPu{mo{xgnr54!d1g)N$Zf712kT*PmU=J2XhhLi{EwUpNv|>D2JeK zK1jM#(cH-ImbZ%*E-TofyYPzhz`iZQ1NTjw%C^$Isoc+B)y{J}mL$CjSHBug%;?HC zD^W?RVlW0Osfm#I<>sRIjdg>w|BhFH*l zan78!T=VHEgbauQ9v*7rCArwu#%3kwSF;vAc@uLRsGfd6-xa@ zoc~#z6OZ^ly2nufo0fOa2w8mKNIS>1a&hmg*G z!2KGp?>GuCyINs1ly#8)Key)pXO=(Nd7EK4~qT-W43Me&X?Hi)*( zS5|CvdW6Jv-lp7LWb)YzcAkqqA zc{#p1JpTQ{BiI-|2M|V6{#bCV@@w?4YP5ka8e#nHmO3r9M;vd z$>m(AN$BG$Mx(eCJi5!jq%M3Y*delv?p)N%5->%Gaf}us9+F?K{_{qjW>ze@Mz5!5 zxHBiX_WC?wGggDdI#*=_li7x*@PVoZ9hGk71rlVyVN~)eg#DztRg$L#^P|OQ z!o%a~Vcaf8=CGh{la!foCC^l4Z>p)jrP2GuE$T+XYKYvDC($>Ssd&P5t_KqW`=h-b4spdQ!F~9)r+?MSdZEn} zjPD1GTz7LgS?X}olm6^*7l>A?#6sjIf1JVm*8pq1Cjw4BT446Cg2`<<%(O=bV?|4Dk8 z3@dsUnE_&R6W>oR^aEH_4mpzs+f%La{H{lW)sndMa;^CHIk+V`PdQ=%rQXAN`J-`B zVfchqR7-h`qk!Yi(##yXj){;aD~|ZW85veoo26D`P{^rD&BiOly+#{O)rhNKN?&bg zeBk za;93?T&H&vJjm|T%uRu)Fa)}j3m&)@J86`KQON}k7f6@{V4|;FIw&IAh8j1>%zjOj zv0@b2+v_PEnT6^zWUxt$3ZiHPI>>uF`TSB5=I$opje6s$F|lUT3Z5W1SuV+~@+9XX zw)--%aiT^Gj>gvb_pHg4hK0OSZkIzIz1zDxlX>r3#p51vJEcq_TtH(*_6*uXI=0Qz z()YNgc-xZOJ-!K|9r0eIO+yipjy=^S*QfCxQ>v++kOI_(t0~4zwjPuu$n3uRS|v!P zdP9SbF-zE6YUhas<5X~&`$U(Ujr|(x=4CiriS8wetX)Q44HLexZ@;%K%_NHxzotg{v)Eu{b;W_X?}a}o?KvG z+m?90T!5hNDWVLhL990O{tnqOU`4!+Gx}S8^q=>oCZinbA?LEJ7b;JwS@ZL?-eQUn z(V>af;GKZRIPXPoaq{c9PKsOxw`MVG?!#rU!**fRP)WtIf7Yd zneIN#5KV%@iV1wrxZgUHc6YWYvsk(<9C6xWu(pPDoakY^@ zqS8a%)Y}dI!wwD8!?jQG%uQ#lJiV*S<8D!CXX^F55PqB|y&qFWG^=$l7m^2f0>wS{ zaO&9c@t6@_`bPI{U%ZmEeK6b0zcCigQdV^PZoOa^ATHko0g?7k^+5>qob&Pab#-fb;+f}j z@6xsxtR+-Sy%ktk1rT?rNDzLfH0O6xfdi%Jg*o9EJK!G=!0mOZ`C|yJGoI3^VT9RP zg1V;t)n6mdWt@$mw$p;|Fcdbe(jU%6j&%9z1L!il0+oZ zV_xU~t(%9hWYf#SQ>Wtclo#S7nZS?T!2vW{`9RlZZJ#B-TgUB}e3mo^%8H%<#F}(@4yt?k; z?MB({e_M8=zm~ClOS@=gxa^%(d9sS2jm=~JRv-J5uc^^u>fwssdHCm2_%GQyy}wGz@Y-ZAU`$`OB?^X(kR_%@tWTdb6QobsV2`Z9YOkS zDN*$y??j-?;nNGFb3$-)y(ejcN)F-b=cVzM(O6kN>Wq!-tG`E-+JKL7fo(jfLFbzD zx*4!`BaK4XpS+}Uk_Yak`T5Q^!}ya+@;r&p^K5c$Z@e<5ySiwc_;OBdEfB9uAPYcN z?WWjwpbl+-pA&YIW>NKkm!gqtjQr~*1K(-vsk^HD)2e8V8mlv@4XRrfu4p&}JJzCL zDG%KxuSQXvcv)dAGY&bt!f;GQcdC51ovD5}+H-)%(h!7K;m^|ilzh=xyoo=dRoSds zJGi?~zMJWRQuF5VIh`-J1f|PbAw9aT#~rz$J6ZCPDB#F8@E>)RzfJh)-PQ>b^uDib zP$9a7(lhz!$!(P9&l6>+BDzw?^7O52pPkZt$(r`S9wd8a*|W>Z(=3|fz3K9ec{*TP<0f?myzR|@mwycs5r@oDgJ(s8IjlY@LMCU4wA9Y%}3V1jzIl}Wr~)Ztg>Z*KquX<^EcN00YOd|FWJM!4 zZgiMUM|BW^236@ObZ2MuYMQ^4G7Q&iWjkW`R~6D+nPQczvjfpin=#TVhGp>&Q)1V> zyUb1ColI^zi%=z{_TCaaer8W;W98+9A}&FjkJZ&hPY}9t0@4hcEKh}EwgH*JCoraK zcx$J@nofX26}lzOET{tVrdzdh>EleIWrgSw47pPq5EBgQE?=DhL2og$1$4HY954X5@I6X|XGk8nEpA_~92hTf?nHM9)gm-+LTkc00 zUWesO*fi<4lcn;jyn78emmmACG+IRsolovGp*t`?PXQ~U|2-BY=qh4Y2__Ky=`1qt=X!vg5>-y>a`HRT$uS7vT*SC{p z=DGUPRo2SiR)>5@%^O3g9IO2izRYmzh$E~~8weAWIrX2seQjXxzrVt41gv@upa#S! zZXPPiT3n>6@JOr1onR*|n0Sed3^71~La!-eGH8=u%tN8d$B<-jEGmL4^cYuGPx+54 zJ5%D@!>j+t*U4N>bP=jZ(Bh)r7OPv1H5 z%B5P&`bKl(IrZPteg2U5%fNcxPK6j=vXFW_8`0$8pthb1aPACX)c9r~K_MA-K)IKM zOydti$bm*1yxb1~0Wxh-l_T3o5a&{3FR-n%;^)yffX+Yx5^F?Kv%s-5QIG{DpeQ;Q zG1UYC13P~^#d3@;AVdiBU7~=qEuz(Poz2qQr~=fy_? zmIdrJz;QPB0YMMc{IscD{T5vD#i;)re2D*f9AVT3`B*FY%oaFMhnWO{8i8O5yY}60 zU`Ki@HXb5aVc&sGt5@(+zw%+kZUM;=0w3nT<$?so9~iCK{Ru(TA-2YisXrhqG-}1L z#t`7J7GT@#G;n^8Dklts2BtxAjgpr(7%<@6Bp{avO@^$(v@R0MwD`On3bd!n`%go; z(apLkj0I4?5hTx@42_#p5Xs*q5mwwJ9mx^48`cEOmKy9|>rP*MrGF^$wI*I$7 zCMsDzX_c{pvT+$R*XS*Y54*;yhmBP#(=!WrYbE8PB9_v7sNmx8SJp?CV1FH{8|q)NZ{j+??h&FB4iVZG zCwZ&k@hyHVweXY7RhqB&S#ibsJkXIA65-ot=IPbx~GL_iyPb))?=GPej=Z@_FyDO6a^d%aV!U?hZr<)r^CcDD@aP+j_`0X^= z0^tY9u)lFLus@^eWQ$Qr(uu|jQ0foxf914@Yrsj5*tp^ss|b6tez;TwtN;ln$j_Cd zejUOLy)WLL!NY_49aAnq4c?RA*4p*aPsnHew?`CHLe{RKbZu||JsQJw=VPsh*I~Ur zxKyPv^yF?%diC#sy*~ODUoF;Or25ZD)h(O5b=r?szr&rO|Ac~Z@^nQcBqs^V=i(Bk ztD3n>=c$pQVfg>+1j4m#3R-;2qKfhc4|y;3%U3Tw9_DWQHzACD#72ki5Z;ji>b`gN zU48N2)+xCa%iJih5R?1_?mrX)tV1t#1$gYp@z*H_)i{RqI;-t1ME6BKEJkP=`>mc5 zUIUK5mic>>QDr7@Dmd0N%i}bQFD~kUo1$7)`y-m%#3I@IBA;aZC7S^WbW}Wv+{{8} z*Y$ELB@@*tIgxq(6F6!$oDLys2i`sf^pbSFGg1F0&A~R1Z#Akkf{Jc;E#aSOARb)s zeD49y;5dXNa1Kfm9dwjk*V5O|e6!e2J;YAjN`>Ao3as9BLP*^8Rs*(Q5)F)x|2Vs> ztA{*wpA0(C%DD(2(nNw(N{88Dm(y4|v8>RwsVkwAb)jvI=XvO13N2ZuZUMQXmNC`np~x!^y(r6cDf4BOaiTAf zm%VplA;jjBT{Nh%U%bmZEnVAC9WpofFfLm2CI-dp=OG7SkY%OBf~jfC{8g*LnR`_= zQQU{0o>j4&qFc;w8o*K>4eJityd-?d+qvYho|Gy|t> zO4y1SCoN9DKWKNOocSo#`ONU+e! zeCkBCr8Qj^5`DCkRvogfRy!8`=y`N~9ZN|m$6n@99}3Kym62I@eyly@;r#Fse`CdB z?_1kFV#znXc?ZkADkBlYMYu{?a}{aXP0oY7w)Zhvq#n7R=2cb*+}(7Cnw=eVtV#%ib} zB`phfpcYxz*v|IWlu8mWil$4`^op5d1k>bZeHS1`f(jdZUBiYD{||fL9T(NoWs3rW ziXf7aB%ovv1SGepWC6)JqvV`HXu*U?mJHI8V}s-j5}TZZl5@@(x@li=C+U52{l0l` z-fw2!%pa}Yda6#Hsye%>_Fil4GR{x7giPTad5I3>k;$4TSDdzj2j}40F*b=LQLYtw zJBS<40)kVQ$PqOXX4s9EBV-}AJ5n6Q=1J{K_8g%Pmy;>O#1`a!eTcdY2;O%;ii^n%Xy472FD+2`!76 z)Qo&3piu8W9hdU2&)SMl1KxG5@wVDF`d6P6(+OXP|3&hp(Xn>mff^ zP-m`Yh|(C$GuUG6bOZfN`#!oV?(XWg^m;f#w93CT>G=~<@xef|-8G5Q{A*1+O-6~N zkyo1+)3IKDVb&1 zTN!PSql)LcX4oMV`>4#N7{{iuff4~1fzGI%PWrEnm4^4f95g?TSE_<(lo$AI_V+fB znaA;TaY{Oh86j*BoF0`%^+=YMed3o5c*H4=VCv7FdVf1kI-ghE`x4Y~XPuGYA$cIx z5s7k5Xk=aoWb}r%_E)aiuJK$Y5hDAUoF&JzB{If-X3%1G0*WU*HzdVr z%0)bfEtf~a#7)=>o~&VoFHYX{%crvIy@X{(evtLo%1~L0u!U3nJ|RBg2!7nwZUQAa z>C{3t5?1N+uR5{V#7fde0ONx#|L9Du?#xFAy1buPTXF5@U+2vJ554Eq{?q@@xc!*% zJL$=Xm3NEEI`pQ>!YG4NX=_kBz|jb|p_LDj>9<)=so(vG*LWPC1xd7uFMw=^9s zqlP_=Pn0~#=FRrToz_dftJ@D%(B$1eOMD|jKQ$Yj^ZiB2Nl|EFQQ5GF+ALp1pvIfw8jOA@MVBUL(YpL`VMEBW?8hk)w?JT)_#^E)}}O>CyXJ zU!s_M>2FW8XM=EZ>{r^*{Hww$nrdCBj$Jb!F2bncCIcMOG#mXkxR4w2RTEDe!8;cU zV^kfmI39TAZJa;E0YUe(VEF7c_uGbYiSLJZs>)4w!KbjMEIiP5j7bNPzHX>r5y_=}zOBH0q* zV>0)@jjGyw5>Sb>Rn%v-BUm1IWS2gnutgQhINh|iN60Wwv}`YAQsdU~?IC`0X_eg& z2>u1t2qjpJwq@ISbCpTa9y8usqfA(NUf@Cagzrvq{LRver_zWQlu_PpN^*LVy8;}5 z3t`_^SYXqS&A{kNMeA9>>C4&Bt49}OdFkM4i)>(^4IPc=K^9~0i!LseLZpJ&1Y1X) z+4w{-ccQ14x@|g{JW2ld4R7eRAVIdZ9CW^2Zcu@@9|_K@n>>=fY@z!Obrz z44C9giSmrKcRaLv+Prk6^K7D=qqaZgB91SRQ_zm2>3g&8UhRn8N46#*pBnJWU4C(w ze7xMKo4dY8*1PKs>LsJwmkvUIDMmN-nR&)OsUG3d3bj-NV&XBM?!zV=o2Py@qu? zITql7{H`ORZMLEQal$#?Yhkb$!w~&< z;uNIAKt)?@05&y-zKJFt=N7YMf0?N#+p8eCbQ&1wWx&!+lMW;BpVZOW2-lS3$f4Wox2FRx(k2-Z6C4K7npM|rBnp3AMA)E>!ky7k@Dr6P?)9gS`=^Ir-W z6R(K#AQkv%VdnJm(u`KuT=~Is?&UYlb&ou4ZYRKw=pV?O78oSK@&K zq@*!v%`1jvY04NOzU+oX3WuI^wjKS=-{$zAAwHJMyd~P2x>Ltkm-H#0>DQZ zyssU8PdfNYqg0D$GF|iV{vzeu9UOmWV8BKbNuy?&=dgNG$Jvo%<%G2eRFOU!Nrk<| z)->Q!-4B;a9+Tllb>!~?8mdY(T1-UB9ml22j~uZY2-WtRLeNkr&cIU#!@E~7Ca_QW ziu^qBq%SEB@bz9Kzlck>i<`RnvIRsBjk`cDoy9E`V0ZJPcV9xMS?i&)lG|=?=OwkA z@`XPZx?yLmhBmPM<)mTmODZz|nGkO`7Q=2H*z$#Kj*6Qu%ZC4{wZgAA1lHRD?RyRL>58|=P2bVQp3qelUdSE@8mz8qe_59*Lo<9o+tJE!=6BrTHKljm~24(O&H^P9~ zBgH6@C9BTYW_x*KAo}L)qiSui8Pfi-^Ct4v`Hg064yf__Z;{k&!iY^iWr2CTYVcDR z{@iWQQLd9mfUe1nfZA9X{ELR>Pe1s+t)JH(^haNxfp~PpISrG_?Qj_2rT$rC^rs(s z!RMox`A7HB{!jh?puzed-9L>JmY&{-@5X+oqgs@^W4IsLh>-K^*W7r0Rh^Yilt*rR zZWc$x6^y(~S~nir{2kv%f-C6ee<88aTqv<+-M7FJ6p$&&@12a#dfSS zba!mtz9YON@Xe$AK%{Iw<$#amw)wKBha{;$pz13FDj_R4u{ee0UeC0#jz zJs28$V87X}AINWHV_+Cw7=0_O6!N)CRV^}DMBc-gO*XgeqxIs8%X{W3a+5k0RA|_Y zo~V=9Me^-b9ArOm!Xbj3hj`Ig&Wlr9L(nFW$srFa4LGGbA*W}R06np#hwXGKh4LJS zj%-}^iXtUI1!I!QhwRx+US690*%@F&RQ(@Q?UzSF(01$HFq%Cc4B z2xOk{{t#sUmfkgQC;_ypV`N_{CS)@6FU9ye54RGaVi;29aMLgXk0u^|S| z=QQ|jm00bDf=|!#Ewlq`<>4p-fwjvvg#_7DcTp1NLpl@u2;~nQwMAtW3LU&gUr}qq zXu@*%$$-nXhhGmhm-ZL{s+4j3vo}WWK1G>?u}M>u_f3VtP|vreANNiMVfE&q0YNs$ zgT-Bv2x`5gy_D0<5B8X6>q>_F%h^#v>9DLMubX3Dk<>3@F-_KjBW**;kHl`hojmkX zE2@s2Hq7gzkHpHfc5E!V0%Tf2r#|RCTGFPWK$qn75ha2XXepYW$n_&wF864fVKbgwIDcmnHAc5 z4}?l;i9paW`|SgI9t=&J@r%KV{r*#(K?YWw)A+;W46DrOp0tT~hi?q%r~bN;W;Nq7 z-qcAw@$~odsSHgZovPvTRFd2bZ+Q5ddYndR(`cW9N=8->C3=2-Hrnm*j5AC=0^|$` zEhag+TuZgws~s{^#lb=~P2;l+$jvwOTf2>+m@Al;nNQzvu8Y-a6mtHJPVnWN^;+S$ z^x|8eUilo309rC6Q+X5gffvIg^bJ)Ib$Sk>MK72@dkI z`xQC$Z{9vR%O9qG?gz-sZN<||mb6C=Abu;qa1~RQBmsNk4F%IOOZ!-u4wk7ImSF&- zXvNJ4Oo`T#KMf=h^Zn%+)iP6%VlY?QQ4%lu-_5er=eTJxFF%`p{HAnpMeiHbTy6b> z!CyA(bt2usM6YeENtj=14`!~l;uCIiIB}dHV>qw9J`bkvw=md(jG=i=JWfb%nKZC5 zzf89Ot&Muayk?FUGuxQHqy|ew@rB{f8&XJbUW1$u9P(klDZr@ycJdA?oxv3U9mh(7 z_WM5a3%WPwJE_$B&wKP*>~_h3d;iW^_hKip8J<^|j!Ua0?J68_M0dwP^dimWpfMnY zQdySC^+s`yL+VLcA=9DSKsTr_!f6r^L97r2UaJoIVrOI$1&@8QHT zO1N-J+g%V{qr{2mof#Q&jEnRcl1#4QIvq7|7#Mi=0|QLl%{UhrGtAb#&Y1%qk-@W1FG3t8OX>`W|hhNoWyQk`+rA-j?jK5c$Nn z(P#pOLla-1v#+Yr*q=`$o4w}rmMDUjS1zt?UA%{I1fz)I` z=k~p$byY6IV(2qNpawOHf_93P=$r&97Ouf22kLfC|GCOF+W<)67wF!G4`lH? zxlaqzKedDQAL~0P1GDcR+d}|XN1G6>S1uhDZ=rkuaqk~$8%qvZ&!t5n4MI-do#$Qo z*B(mhP@Mqipde62eB^4F_Z(9hpNLohK@C8qo$moeO?i>^JzI zjki;UUcd=yucTzo%O>|!W$2L6qEJXp-(s={auCK3|8aVpPm%Kv9&&>~ZZJW{!^n<3 zWwZS$jzJ2()U;*B;kD*6A=?tDEsk`CkrOTYaR>Sdn{9xbp~JA1Yh`d=S>Yr0*%dbt z?g$m6f5C3J^xXK+=sUEDXU~~86WTu@Js(PdVm_r6^+&VUfSbYt9~PpdeqhjpQ}USu zU)GZ-=Ee6Zk)+b!j3VEP)67PU@M=@(#XS>_O%W2QzpdObQSf$YbC~oKl|~_C?32G= z%O(G4218akfuq*74LvMvg?P-Z4~oS>UnG@DaBwnL)VTIt%gckM#aeQxya?}<5-gmO z(1moQnF+M5odJ9aPjbIHx{|z7_pytyiT;v)HAt z(h%W2$V)^h__d5q-hR4)&Vg#)MG7WTglFRnd|vaW`iMr=M8ye-{)JNGhaP|6ewv_!O> zO;$5pwE){EWOOX*S|Cd?Jn78%2w05%YC1r$+4{={Rgth`z#NgNXL$a`gJ)C>t z*C+Jqy_|hIs2g-EKV;>_Qd02~+l)RSM^G&B86R@dTUDL(3%8O!&^9+?q#C2-ap zoLM^^72rOv9=!dyy6ncKds2d0@STtd`~*)^7q|f-)v@jIX@li>+_S(kTJ!MkOYwAD z=JkTq*A&^6x`?D$*~7jxvf=rOHft~}IBas-sH~e=-pfES9O>)kRBIR9)PYrLm6jG5 ztcFWDQc4du+_+xQqOj?(ro+8LY5F*3f9)|N$!$ZWP z1cGvc`#p)&gzH#Ti>GlV3onx8vovGzn`8yGD|lSJuBjj83!)|kXu2=G6;t}-U$PFZ z^PC+EirO+n3qD$M=7wFsd;LZwFgvk)engF(zjV|(OlZACy48@!zI8e=i8 z>|g*D>^aIb$j%YyST9IMMsR46%6dm{DOA$ao4d>QUsa;cxnWVt({L-i|5A|V7Xx-f zqQMZ)ICA>Z_r`vV!Fs zBZyC|Ca-+pJi)oRQ{ZpHeqqy#plSB)y6P>Kwuizs_ykR4lAB1KI;yl>Dl|FhE2&VT!JIEsmDlp@whuc#6P=Y3Ro>acsu8J20C*DKpe92r34jr?a1bN9I zp}XJjA4&Grb!9=$Po)KWOWe~T9~J6eRp0MVhp?`!#cbDYmcR(Le_*(7bzy$rg{C%bQ?%~;oYX5HP4 z!hjGoVFWm1J+JJPq0dxsD}O(0-NCXGgR^olWZ3lJHUH!vkpSyP*{*>)pB;3dPeas|H8o&~sI` zz>G6&7cS%`1WjLNo-#Iseom{AhRSRJo9JhdWwtEn6hPVR0FgBw*gnZ%-4-BX90yD! zhuCSH#CYpR@1|V+Q?tNf5w{)MtDy`Ii{Okt%jOy&`ajM5@7$Yw+f8Doig%KrtO$Bp z!il@GUyKr%H?eJ%B+OXaJ=@01AKvX}t^aEl{*dxsD^Z2O*Ipit9eqN%#i;q#v^2(!PhGXPZ zCNODc2~MPt<*Dl>0wEU{hwjiI?d#_BL>*7dPMLz8by6C7sG`<=5<-UFxR6|5t?qer z_b8I}({$ag4r2fR+OpwG1WgPl`6#4#P^LA~Gdg0cVc>tu@J?Jp`vH#>8XS3*E?hcN zMxfA;T@vG(QC^Em2U|9idboCS7GvrW+u6@o9(ut}uK-sD5`cu%nc<>uxE3V!Co}eV z>b`G6msx=0Y71RLYX%$ypVNU?23mJIWE^mQmH5Ug^xp64O8KUYR;BrOs7h8Q5@sK#^d{DAWv=7lCoTfd$ea*Stn+>u)Ao1(mF7@T%&5} z=jOk3%g+z1Iy;m`lzQLw`K2g+_d55R!jjTr??^~WEBD|L`KCK#lXs=(c`iP>F5S96 zy{GuSZ!FTg;jjc6d$t(zmpzl{vMxD7-xuW9u@HL{craFFcjUBntm-DzAwn57W)XE$ zeuc4(P9^lh2~)u0O%$8cy7O!?lA*2CEVk?DK9=)bHsPY3x( z%^T8nwruqQ9BgAH`>KO-5Y*gp%Y1Te*1S#T5jWpc+zJ$I#cRTY=_&`Z@c9^grIyVa zi{D}Y%W1Bak3EqPCOG0I7pgD((wEBZD+b|7T%5PQMB<{b6@R(TQ<25Ji_>!gO5<}Y zVB~e0uZ|9_+|m8{c~gEKu%hXq^vdC6Kk`@FGL}pP<(Pi%0%zPhB(gzF`K&~6HSdh0 z$iIHZ9AcG2;=0JIV}t1D8h?3@TqUV5V2dDHqqz7C`pX0n`?>eBn~A-y7_`6o`zzzO zs*>v<)05q4oRGT77=B4z*o;s@|LAnbB15%&Y5rp>hwnH+k)q9i)e+*cuuw#uYCSTyr%TrM$h7Nnt^6m~xhva&R&GSovsUlA<6Yp%Af9Hsp?e zImp4Z>Ur;M@gfgehHp2#5~ad#o*Yor{RhY8-Lb3)71GWgMV% zo$CCV&k_|b&)|sH&rdrH7uD9!Lau)r{nXaSy9=G`Zr2;Rfd|M*GViVqB)bYs=unFJ zrY$SAR(dBl?S2|~(o|hoD$`NX!QCdR=-HpVVvR$TvN9YeJE{5Y>ld9zj_v*x0_4;^ zjL1YQ*(_eTMW*Ftj`A+P*PvC?zuHo-HM6D`|-tiuB!Tr4jKa)<)2(GKyiQ#4X>;aMeX#?QA? z`cpYCOK4~9_MsXiGSZekpW}dqD;JB$qm|VBwsDgG@*@m;2ZSs*$KdWq%XkhTEG%v5 zcGcNjTJ@cx1SkX#;n1>t)TyPxF&FIoD6;`z{9^uuB{p(e9~ip|RozfcFm+v`me3@PJ~}ELFi5@LXgz5xK@`n?{FO0OfI>vA=dXv1 zg+;AGElxvuB!jZivz>~+uDq-Ycms9URW$!^h_+Uot z!E34o4V)0`;SyD(C-By%gW2nMa(=uO`>CC9we;G4WSjFUq!2wjL89`@%w_&lLD3S( zqJewOzv*rI?K`iu0b-6k$i{!mJFoe3hVwZZjjHM|(z#oOWe!zjMUlkJf{am5v0Ysj z=2Fvm2P#&l>F02qe+SEO1RK(A5dC(0i zCKSrR1Nw))2Y+U+!G@>~+E;z*m>hZ>0Qt3OUjwwK`RLuyDtHl)LD_6%NJYSE`m9!l zzC??r5BasEJ#25sd*;Bit{pvhE>8Z-eN+Ba@{dNid+X-|Uh26%`LFl=Q&A}ZJ%Er+ z{(~gRf08DDnIA5>>O`b#5t^&W>p&_8Z?dz0IcM0zE&T-uLcA>EoiMGh&cpx+M%fZzIL^zDa^}mxY+xwts8i3+{CDCwn?gd;0C%d>b9HX3;Oj%tYoEsPOQG)SHRb zZKfQ+yq3Ng02I=&x5hY)$_9+X1#WY1dBNZKV~SXd)fU6XDl^V5f?2l>VzfJz6Gqu> zdXJafv$(G~A==)NKo9DQTcqr-` z1Z5in1UHJoK6?DqKlcxabCb(IWO+kSPv z40RHc+23Lpg$yWJ|5NK-y&+cBQ2Agbm?26Zlz_(M#b;?t4R&g%TM^2u$#l7)cf#uZ z@drk(gbPXcF%2f!8~8*mYJIn?f?aC&VkK(;^onqiWFn`7j?@HrX*9T&ooH}RoX;LY zHVxYAl1CJE5wFE$4!+e@WwxQAvMb9O+ewRcTOYmG(fj977qdi?kFz$stCiS8m3ZxB zFZ8RT!%p^5R@wpbdYb(~T1r`zUnV&q<(=DyseCq9hSw8XRjgrK!34)>KB>nbYt0jb ztu}x*VZjMEo1&Ge&{?ucIcrWgEn zS6TVHPtdU9F)qW<8?P+gS$?y`o8~lL@0FQDpUsE)Wrrv$%C?}t)eiaS;SYK+p$#?% za}87#C>2pI-sFR!?%s@_I7__V4(5e!DssCv5(3RWu~(~(lLtkT{*v;EzINBzCnx3Z zB>B|2&d%X<{J?OKYKOh-$>M`c+@iZEgMpvg=M|{U<~u0HYQcS+qS(9NsbACFFV5Fc zwmCQc^+m>U2t*M`arV4-zR41JUwbkhD+^6dv#WKu?tfo#hN9U*qwdi;5!kbC=k_X~bz7SL%n<|mSuct^g z=*G>QPZHAwgACR0lOtfP-2TC0;?)ibKQLI^x~GEQ?2b>$<#^mNS9Xt6L$>B!CCE%g zKKl}8f_yAyVxLoOdWP*-sp}v^6ArU0mPxjse4>u%#=@-7+!ELdm$-x*-AJZ_JJN-8 zusL3$w{}TVg^qNf5Uq9ju|qXO)lTeOB64irgJu^(dX;W>a+fx;8!Px;eJRu8pc|N( z>tfEuWxX*UK2shwUfry~Pb^$7VnR-mVrTnKYe@eoW0bJ@OILlLl{T8#W-iMOFQ_`c zgwr!SBOUYf@^EI6uXicM15Yt~hY|wKL_9~RQ`@YrYS*Urv0qDXxn)sMR=a&~D$Ut- zr$lId_Um%~PriDvGsY z*d1kxvzR^$%haC^-+Dw4Zyy%r*Q0JhP3Tl2I~|IXB$zW=n`Durl@|1RXS|2k|AGJJ zH_VHgbLrfZ;qjiQ7DqU&+C;kUQKOftPcS(OE{D-CjL*HiH;`DTJ%H4{?OPR(`++v* z*ybyq>8{WShnF3}cbC##lh#^)%wh+0Ugd|nI~-z0jF+SzoAN5<$>=&_WKhU7mtJE_ zPVgKkdf0DK7ADSp;kIF_(*WI#2Pii2P54}_k;kl-&Sr`Lo{wJzv{d~07iwBfukh~d zQqBh5EV}EE_x7URtQ1O`tG)XA-^bc+H#%@scmyO^GrRe@x7=m%l6)0*FFOD|YSjie ziG0#K=eabTJB%MuATfJQ_P*)8NPoWvc#UR^_%)ux2UcXxk0XJxC2sop&G_$;grlLL zS_AUEnj^E;A*K{M^_c4b9=9msENA|74700i&;feyjP>~jsq4ZQl@{d>W3k?C6Y-Rc zw9k5TZ?#;}`3%v;Lzno3VtmH9i*qq5i;az{l+NGNR{TcWsaWYbQ5MppgO3k1cU~op5aV z3*yGc(|!loA)u#v<7=}VK~uyEqZ|taB;G{WFdvR~?0UvU!g4LSGPGNa{N*8iY<=M;RAM~HqW(YH3aaa)R;=e`SvtjaFm=j&U|qA^lha&%3DYD z{oJ*+tn-pwFRDrhN^-BJ7IceV6I#%!}W=Q+`27t?fFTUbiEx~*ZksSo07CFiN;@dp=2 zZ17y+7v&v~luinyt~?9yOqjmVx~8^&#&0DryVG=0*tNuu`K5OwD>>oE9tx_&k}$hu zJ?%TOe9iDdKVhz-E)sZKP~R(4s+_!;L6`lkAgX(7C6#d7{9_2@R%K*(O&tN>DZeem zKUaBl(vS&SEG!w8YFc~Hts0C7RFN#h;&AP6VEvgb?Sv%FwA0T8c zqbN67_PsUs%xgF6M12S0R%6@VuvI(FRc?cm?Dvey4P&MOYK<%{Qe_O~*#ushtCW#l z=?UB7*Rn3N@3xq-&zo6hGJIxWOg!*xncbZ4JR*HND*E+t-q#B9`O?dnFwd^tE$1Nh zLwD=c>f&l6mg|M@g0?Tr__qpBuU&BnNC=lb?BC$?=31D7cJ|vUuz4Bi@s-wz)zefT zLTuh?;uemwN}KvBd?yUX#PFcnmXK%iha2g@gl_t4lVAI)rD7NJs(fjLii*aH=SX(Y zh0R-bSI&sKxj_PtbZjtE!n>)Uo5w@cOKrkHGFoLYhOl%}?y@0|>5IJ1RELogXD<=9 z@I{|eFD)rM4QOwdLJ5p3GOwy`08J&%D5 zVg&nad~3z)Zlp1O=OrF_7}SzSE~M;kXQYE{9S z1dpF9XSVgb4&%;9EoTfr_BerR<|foSDT$>DN@jUC_nX8tCo9am${tY zz6s%(^olp1mv44s`NYE`ND@uZDD9jTu1EG%y5N>;$kT$i%Xin4z7$>nsObFMnMs4} z_8%CXKQI_QwBGGRC!@X_PMT{tz8evFWR}&QLEk;mC{6*Wm$EWWngHagGmtqfxe*hJZ-%F^Y-yR<{}r0%#uR zZR{v&MbA=nyu}E){P{6K-aK81i6~552Vz$ zwbxv4Xicr14!);rw22d_KVOctfb5^{qp#L6$F0JxJGz>dMpK%{#YP$^ah z5R%uGN)gd27g*%mkrA0Wb=!d}w0r9ya~>LSbV80LokLCzp#ZDE1jr#8XDPG`3`imG zKG}dO5CrKC1Mv+Iw1Lk5BlG6x%2lD}2tbbfe|oX>OG(_;R5dm7rx^Pe^Pvs*QlULX zAUWa*;Lbp1DEc8w-+y3ip#WuwYlHj`4yxiw*kjhW?8K%A0%^a0SgFH6DBx;lpjwmF z68K1P=>4hBRsYn= zViQ1b{RCN*xRI^N{Zx9{p+71QuzCKjCy@?5D zKQW-aVE|A7j+)KqFt%StF$;t<{&CnI(1U)u=ou>1AE{g);3xGcIMVBHm4=#2osT)R zQwgL@FtlAsaFWx2{xT2%i}%w6gZ*hMf%PU>+fughP{gm+v1btc{N#I#Z7 zWZyTAXgVNfnIi>Wec`&ZD_2(8qIYmmLE4Zr58%gGe)_bjy|NDF3%r+WlZt0pgQT>( z1f{@K$)VmTf-qn!=?@Ha4S0on<;8&qo(^euI$zhS!O!q{cp-o}x#Gi>MG+O`ghAtQ z-Bk4+?%@+?5QrXF!fJLl-&4#>;1!yz;-Vu-_zRYwd1^SJHQUbmpjiWb=l&4K)1FhN zAZOvanOM^@yN-~doXk8E#1)f%j;-DohZ;&0x&UhKDlH!@c;pY1e`e@QO z3T=o@H&iOec{HN_oUEyP_#QMZrfv$nXOAoaEwc|YPeg{?g)ZCZ6M(I16#`|DB3uaU zP@UosCD@X_@Lm50{4G#rJXdD?(}$QZ`(f6ia)&U}k#HHlPVT zQCT{t+{g79Gq-e=Q)T=69@?CBBDgBeQkfjiH63m=%yAs%lj&o09KimyH#vai0!*wX zRYzf4F>6$cm5N8C{R+$>E(Co;j{vB~Lypd%Ed@YCHDp2#T|0Ghr9eMY0Fh2JL^VQYFCmkKZQPpn$S~d;fexz=N!$1q%1jtyAFeHye_J zt2eZZQxDBwuUO8Trfq*0-E2pv6`0ruJpD7bd%tt71Qk8B`B4-T#d;U2dAaRbSMU!aMCTvP(zv zU|uZ2qlcGMX&b^XnxlJyHvXXsr{CPRC;LcaxRe=W8)R192C~dP5hAs09^koP-}wPu z^LIVsZ)ao65!7^_PzDz(mZTn&+R>8vK#t|f1x}K{lijb~njjyNq9>$i4po1a#Iy>AvNoF2IGBz%FnRV_dugX9kki!>twub25=-qh8?`DoW zUEr%wi>u6Zq!@`W6N`VEMqoky?d1Hs=TV;&kj=3B3MqbuN`Lpu6#HdP^T7b&t>dH) zELRUe9KvdNoY;sxpHf({Hog{;GQ z1`P(w8gVVb?xZ7PrY2|aR#5Mjp6BuO562WLwP792QcS|OoKl$@{H^A z*KH)KmXGpUxAqt$iv61Wc&3l?fKYC;5sUHXB#mcTX{?25oaQkQn;KwG?f?tr4Gar{ z8ELb1b^*XZS836LI)fTGhcpC5$S!n^PQ|Okv8mIG09-r>K{S+i4dY^8&$409!o;Gbvd8fEa2tjf7N-{YN%&>7J|I zRury=balwt9UQZ;CE6f5Y>bB z9StWqf~O+TVyVDh^OZ>m`?jnM$caSn%3B}y-z=LTDlE{)abZ;ZJCluL)b(#a^%J2O>jNrI4=iaT6Q4Yw5yOd4K=Af^Vzi|_801@!6IH^ zR65rbU8sxkT-tco3B@caLmOoANvQ90#p`BdRTRhFaUWwz0v{pQbUh38=(qe~)TV(p zG7Mp1gPx|>9b_KL_6!`{42O;+y~=&~A=5JK>l4dUCmDgjxka1>rt!e@Ojl+_dIb>k za%+njv{}y%zF6W=3I4}t*u}#umstepmAkcI3{(YzXO^mkWx>v$7@FRbg=aX-2+i#$ z^8#{sCE$1qPUxJjpe01r`!;Ra=gShYD}7_kTM^|@vMp5NfHEGOw09IO<9ye>{ctj!mw)Sal)Y9=3EU3jmED_y3W zMIqj;%wU(wG&1j*v~EpJ0?$;ZaVdTqUO>E4Uu+x2A=3h&86x$?+xO6dO4@h+}S#_ zrD|`{HkhEjrqyi*72F)6*lVM)ob340QSv=qO6 zm9g0t@Gx1C&xEJ6`Nh&LC*Ll?VjZTinACVJRExiC1HbjsZKvR3W;wYZ7&@2{^1vZe za_?spFze5FwRtYc$ja0Kk^uci&)b9I-45Z}!W8C}o{wlr@B8SQO-O=E(l1P*3YHh< zn^7&n8Q>6<({lW7OR|gC^QtKJyYxo8nsop@xd=cnBh^6eJ(C?W zPYduey3r?B7Mq+Y#|uEbncGOWC2a3_$pE^U$_6Zd$aY?0MF_#(?9>g~!x`EXRXLY4 zXHh)T2yOx-IC;te_4q%+<{kRbrZU8^2E>))Atom6;YipIjKY9bE7(qC{J6Qi6Al@v z0;dT>=Ge%78;X^w1WA2j9bIOrCN#MVsp2)-SqU51&f&9C z32?Cg7+7{51DF2UlK&rkztG*5Y$@a6a=T_IBa%1$DdYPOc)o~h8!~5Mxd2r;^zQ5w zie{}8VoMgtE>M567)2WKX;iRhJ;)60lMC4z0IQ-Z)YJ;HcVGmv?tw82$O{gD>cCMA zr=MsS{?>(JWjZIXR-K^{OOQf7*vaV^aPk4jqh_T)-JSV#!fufus}HS`fNmXzF0D4A z&miZjE{Br9Ee27iJz4?4r0nJ8lr@*S7_khg69p$EgBI`z<`5wF0m531_B&+{>P!C!`KTZ7a)Qbg4mX712HO&(lk$4>}giT|?0||~p{YnzglvA^X+u~Ky zu2}Yo|6-ngNhjPVHz)C5fR2)9(wJ}zYsx^!KZZ!2n<@OAS=fz`Q!BzV%4CBZ=t`Qm zL}yckXcDkDYFb$atd5>5R>^HQ8D6%3^&@alNPek+;F>B{ z%{QpQk`HZ)Zi=Fu-NBk#F7t_jxP+Xb3H9_I^B#H81RK|+ro7it)qu`w%k7NxeNGNw z?Ga#34#4=o`OL);xn)`saCB{|FN8hRYY)J{#K1Ph7DkFePEH0P+hR~O=Lf;$#5HC2 zXEMb4tyN*Z6y#VA>T8oJviJ!)0pGUSRO7O4yH%+CTq0y0>R7*RBHjx{PMwozMl8k`pdxUl_k;1@%rtt^m@&NC8ZHn6-SQX3o zv-aN2Qn!W2B7Lx(2FsedAb)!DKRxN%4Lf3gbRSQLF}$-Y zqiM=K@53~eCPP}`^kVp`86Mrl!(AeV8$=cu`)iXh4z_ceB)q>aDFG@SaJl}bVzpu|)5sDo9!c-$Le@>euV1IV)Nc0N z@X#RpKsC%<3NJ>8RGCKjek@BA#nFvR)Rwt3Te6F983Y6i;y@y?9k6xr>|f16QuTN7L&EHAf`It%8hmV-RO0dc#HL@n%f+(6q39eZDWwWOf^s1hGlq^ z-Rqvxg%nBGA);>b#k$P-{DHy+29d*71TkE$5QWpFQ3d>nzk8XoIDkWW2PuYFt@NmOho}QQC+Nr&zlWJAWjhmlLszhuaG5bbM+Un-Fqu_ z2U`xPxjbzHO5tY(DZoIrvhJbFA!t9Vl)k!o9I%xcDTbcn<~gZ=ovqr^nLYFjYeXsq z+DZU6QTbpuyicgtbimmsL5%mO(20hUZk<15-V$uE*SfcWSIqD29krn!81q-5VA~C% z4|hI;y;!Js*_orkJgc_>`av1kTW>L;{VcB%oZyT>M{c7ZRuoWQDq{!!gicKj?xYvB zcXudHiT8GDR!c1~wg68d2ZGksuJ?#!cp8urCaYd*$A+GeJ zlj$*yrI8Gpbd_K!AZdm}Vyjp!;Khd=N&Y>Swa957Se}(@h49pI#tR+l;}dH>9(q{c z?e(b;umM!!pbT3vfqPpbIFvx zM;(;xQB-~~Dz>~8MF%*C(4rR-vo~lps)R&+>yg;6D`F8iHxz`N87>Fk+@egQndMyd zVJ|GKwh`(UbP?5{-C1~!$>Y^J<;vZ<;J?;8M7oX6pQY1jDyxNTir-~PspX6yY90l3Y`F@vt@G~UOdV2t_sxGIT_FI2Yi7B+@Q!^5Fc zScDS-(z8#qQ!qc1c;@iv>ljSEN}p)Wx9<+2^vlJi+5cbcy>(cXTetrWf}((cN=vAO zQqmnuL`npt8&sMl-MIv$yF)^{L8MzmLQ=ZByL+*GC+_|14bShl_jAsBo%gz)^PcmE zmuu-<^Pcy-=RISL?`Mo!>%p@t1;A500&M+`R!}+lnYhSi57husSxMmy<>Z{>L9IRX zI8d5+g{&gWXM+dET_y5W=qM6Gx2;3`*o(6H^xY;Z+US;O% z3Q`|n*7Vm9Cl7sz@Sg+=7Fp5&tQ>Y5dUWJD<))5>_tU6DRXD2 zHP!csDUakgFR#pdbI)c-ML;grbg5eDk#3M$*z5CoieDynY^z0tOspGX6A9X+_)F= zE{v^<IKE$9KJE8r z-tz`GWx`FWgb$8-!J||=&Y^d9T(LLN4`jug__t%L7Byf$K;I(HfS>Nd=O5YKQt(M{ zM_Q0rd4`muNdnpY?(@)RyKGq=^%~zoZ*=iHXYVWR<^#M7%$_d5S9amEVRm2W=g>PT z3ROFw8}YO{fx+pc0x&|HYHg=n{F1T03}eB5t#qvN#<$?Y#VJ6}hJ)+C}XXB30 z9a;dw?OX*DSAjib@6JnQkY#!lQNg%_Cje%6M6Jd$4me77vtGwbXt# zePGRRw*(_`c{Q+a5xXMbnkPI%i2K2i`R2}}^&gO(Gk$1R;ImlDNDj=VpA+4doKnV`5yVoQ*f8D`A4|Zo5#|Ddxd*NB^#9 z(E1CoyVmk{RxR5p0{-$-J+SigS%Enb9GRv?N7?I+XTio}670y)A-~mnf8S`bwWE^m z&U)-5d>cIJO>lbhAb&dm&RBtoz!C_k|r*dfLl;I5dze`hZSWBu7wmSMbQrwZom7H%m^*oesX<4sguhWo+ z_7;#iNG-LRg_EY{eg%=>#DCdFMXjId+n{H&D90hu<|kzh8=Co;n&4Aummtr_ozMm< zpCUeQ0C1_ob5snrgr&J@dk6-W1y~Aeh1D~^V z-{+&d3;}bTW_C%TcIx7H^CHndaig8-I-G2vqu{8K1T)>pqn@e7VciSBc=032u6XsC zSG#e~_t2i_!w(-X(l=A?Kg=`e7S=BZx0Z@5Z21}L5H_J9YHDmaFGS-_L}}cNWclSV z6)^~Gaw84r<4)Uj- zDPv1Z`Ie^_|3~zowg@Qj2FQO6-k@wn01eKQEs6?TCXSqR!B2r1@3-N%pLl$5ZZkX| zL$YN%UW1Pgd3fmJF0@DH()G`;C{Q6<(cP`Sc=;OZ&iV*vV9@+Ea^>^jN&Bt*oq@iK zKt1{AHDJ(H$nH8Ybe@mslQe)G=F4pS{Y{GY)4?7&TLf9ABv*7@y2!;l5y(2{C&L}% zN%1-_UF71O>_4AuCI8>Bm7?lG9bql+-$( zL+Sz{(wU3UgeBvqJfe?y6#ooaq#XfR_A69kLCl2u;J)-?&q-@mrBT=(w2`H)O zIw}{7rH@e?5%9#5yK;M*c*@c#7^B0X17f4C37jhhOK4hPv!o!J6l~?~&3!cy4RNi1 zdK)#Yp$W`~BE}vK3P~DGsj4M|-uixi{M$i-s9W{uTbd$Yx-u#batq3gM(T)-D?XJ# zb`I@{b_rpHx8|I+$TwmObw8@9jpeQPg=$R(MsZT!PH0J)7ep+P9p|aCJ<(e}A&r0E zw0IcBnagx&d$U%SA9*R|ECR_1`!)x~$L%Dgvw^u?6HYLm3-L`=G64tx{qHt)L z!abC;iQnE<6NllJ$&PbXIki1{+3^LjgtCL@QgcH7H7IGfA4FVWdmR@-r#dO31jbXw*ELc>!M}J##PrO})8Z1}bg6MTNqm@J9ZxIj$9+ zH%9oSc(C&*Pf7xc!Xu~9(8-P5nhiJK@t7-zHBi;2WgYKoHAPXfy&1V0{G7wJjOs30 znan`mvW=v1_H$IZ>yfR5-DxD-Rrf;b`B{A5xEk6wA|mCJ@PH>Mb^Ho?DdP=QXlWQ3*G8mf}%Sj~YRhI@BCr}%_#_TR#+euSH3Org@ z%*!owOm8Dm3L>hARdV$HaxbDu4CyNBUJI#V)^}i@(KZtsl6;OQ5u=xI3s;JOf}05G zo#kYLTSiGuS&azP9>s%K`ITG75BHXQhnazC6B84GE;>=N43hb$w^gnniIHwO^V69$ z&G2UBQ~CDK%0Agm;P=$zzmA5I!8T2ONG&6#rnXr;sX1!z=+fR=RiVAx3D=2$&7#X@!gb+Rn-(ps9hU9h*zM-n}v+T=lZgfGDsz1d!eq(ZQ**m z@y&9}CW~BjX0(Jj>$G)pTJp!~drFbJ&nbL$Y?*zK(75G(1Q~fssy4A<4WbL$2%}@% zZpcK!j8mi^C|ZuhCvb2sX%7{?`|XYOHOYcd7J|UL|`Ve&#=%S z-pit_^QOIf7<8j2D*^*6hn=Ckt76mWAHH=~XW|C0Tc9R8!#cTZ5Iq)@sN7-C56^U!qt>7zKSEF8C9PLNN%8U0c`*E?%D! z;|%sOF|b|kR)MB{O!A4a{tFj;;$J!K^WTaJ=CuJqv?V@X$I-$A1b%|>>5rCB?9(Oe zRShbA=)q4Uqb)=d7KDhhMNq3wI$yi!?D|Os%6%-2u)r zQJ*8vNqI>{!+i-k)LxFY>}l*Dfj1qn-%qx0HHPWOF+mQy^AjBHOp*-reW(H|Q!?)% z@Vbs%D7{2HC|+h0zd%NuDs}1?S3G*?QkNo7xX9cr6F`8aB3e2yI^PSDrj5NQ9q8!< z@r~IYn=f56dahHL`lDJFGbKxr?BigY$e_|t%i=4^r@JrwWGe>ATE+Xsag7SSgKq_A zn6;U2DkUmL-q$xKF`v-vBC?zp7}_ew9OnM=z1bmyEIvm~IX%|cYW38vR#~^g0zGrN z!X_@5YpUmGxv(>pav7%_scah>p$2i-Tx$bM%QQLpIAGv0Z1&Hk*?Bp7yT;- zSqAaz`9MeCR@=C+jf3-4I4*rgBE{f`Cy_YP!-A(=Bqzk!-p`mdF>*u$7e<~1eHX=E zV4cAei0;`*w))xuMM5kyzAvVY?G;x_JqW#qh;|*N}m%y!(L@rcwXz#U+VqdGTe( zxN+mWRTHawbt@`;CAVJPd*+dzFeCl=kt>RMJ!Pl^5^}coH{^#n>LY9{d0zz|VG+sM zQ4x|&g#?cE@pwi#XEzvA&F3fVj!M?NdaOxz@RaR)Sjl$Ha?0#%dl{)ap8sfMJtZa8)$Mx z8ItoAbfcwTyCJYItvHZR@Vsx@Ahz=a!<;ren2T151)H><^ifztSXc7(433`3y9FgJ zBzJIw5-TlO%S=gWsD9{`_gY_n(7V@$R_-lI=xVccH-?Iszo2wUNh;KAcerzV zNmUl|2aL~uZM*_-im*x$%%S=8Y5Yu{z)htm&H{7HZVQffiH7y{F=%K5<<4ZyvRj(v zCk*X}hVebB<7yASA9#DoQkaeU2330tVSQxcCO2&G;iInu`bf(29P{Tu-{9!@Qm8uB z`1<@rg`JlLo1$zRu0A3rnFd(;?0{#dL=7@}cpKJS=C!XEZJs3d=YpMIOPw)rZjC>M#4JV)mid`9{yIyZMrf2>vhK4xRWcz zP%hEDj_nrsZ4UB0GEpDB(-F_8xBL{v_R?p2Iw*U2cln>T$@q1Au5w#|Y&P68KlUwp zJ_T65H!CbaY1{0*e}y;qRs%6u2(H$tW@R3ci}$ZhjLLkFtrS^2EZYgj&L1DOJW`Sn zCTYhe>Z?U7sTs57d7K>ffD2ZnS@06eyd0A}Nk+5rYBfh8z2a6gF0`BC*ZslPk-hqtsSc%gBU{fVOLtcYykwU%(ofq?l=|dL&MSYNBr5yyw zl?XI}UCG6eY2qKCgRsHs`ED5jVyLqxfyIif;U^MuFED6zYqcGD9ati?1$;rV_fR2V z*yZ;^pky4$T)rugCKARtL;k<5{GZsD5*H2ZDnFKZ_^ZFO@o0owB(+vP`IxnjhL@sl z2Vz7hl?1k*V|AQnf4v(6VTw5aJ7^`vT1nAAwNRkSc0VEMa*a;+V-HJA=v)yKgImJC z=f_q!W1rn=;@OWfe6C(FBVY>PIgsLMXpdFHTsE_|ADkdvDSskyfDM<*;vcA+<;X+0 z8<@acq|a{VB;`9k1K#O>gcY*m6GCi~Z@c(!v;qC$8ARRy_@sBxK7$&N{_4-miv|Lv z{TlpU&ED9~HLivm4`Mk+DQ{y}J>cB>#E(7wBSiiZQm3WeF!EaKLhv9ies-D44Su#olye)uMt|K7NDdR4x&a$yv};^)*9tdTd!3za2q0WV%AWO zM_rLDn6GkO$JWy>THM%@e9}#@JL)8G*0;6SbatSz*~>{3dcEH`oG;|oj#SLCzW08U zGq+qb-sWc3SE!~POuR0tv;5QhuAfN!-8Rn!0?S_?_nWRstZG`V+iWoL2-{q3buk9> zYx4@A99iMWvef61#MraqCYv2PwMolHVO>wS zR}84O0G5$swC!Q(!mhKTFeKQd-p9)A(tz~FIt6GR+ah6QNr;6r3X($I6=-ty;Q&Wv zM0ly~C(47K{K0@GL0k=Mly}uf-P0}eI75QYFuG6jJG0kwrKObJPn1$HBZvt38|`uv z(eyrVces{>>i?Jvu6iC+s%G)=6KbG?t0#F-UD8dAZ?Q(1J#eW(nP#$nccn6wGR~|B z4hV>;oN3tlWyK(0rDXHga(1))R@GQD$?I6>2h)0E<6i;}AoH;alg$F8vD10!eTq%X z@~ncH6lz>uf<8#!PxMkET)Sn&a*2d!u8Or#)G&y(S5yn7jgE<>=h^L#h(< z>YAes)U2iA3Q_{^`@I3Vh^7!ePmi!tKCnZ!deag#Z5#QIvYB9 ztUrDeBZ}JeWp-8Z5u(d$7chz7aexE#4Gu8gAh%&te2H*L@~tpK$nN$-1j=_1b-Eu< z*BUbwkK&$teOks@{I6d7_a1-pGXH3%$a~EPJ?RNtvUA6wOwVrK$(K$SYcx{2Z;z;x z0-oO?*dFcbs^1+!nNacga#eux8PEwx9~13Oo*b4V%m@A{w0tWtW%&Htn=;OqD~l7a z6YQYkwgex0l+nUNlAyjkYrJ;5;TJsC390UjpDP2^PxaCEFNAbY<`GZnZah75V0Vhs zI;-3~X8RK`2itID_5N_4l7O;d@M7XW2|Thce@Tc>N#;`0)2)6K$3Xu=o;D{f%W6gH z!-9LE$AZ!1-gOW~Av~oW1gyOUB0$in6)O=OJjOVN5g_y?H45O9ZcNo3AXqK=F-y38 zY}wfr$c`>Z6a*qpa6}bA^~xFN;abODgV3Ky zoKyactcqaYEQ)xMM)pT>ke_HxonQyS2of3s1OA6C5rUW;*bj=INYt`Hf0Q=?%;|4! zdc6dvBj6WJI`bT+?73q}VD!k6`Clb@iI&1-c>;Ha(GG~5n2rZz>jCQuE+jY7A zb(h`r1Qj;dD)UEwfILiy#(J=o2fMmpj6iMP-Sx%|4J{C)e|EOiwUFUH6tl_3H_nfU0%40sqh3`d zCyqRuwLNXXhUJBJ>!iv9(0twC|F1UCUJzRpJ3wU)Y zAt--kntTBar@wMrUOCTi8Fahov4_A7d3wM5q`{wVp6GqZi8f}Nx)vG5A@eZWrZV#h zHzE17>V^-!F^Mk`;p=dJH#&AF{*1@C&2-N)=rB6ZL$bUJ^X-(0829s!jAGTRsH*MT zm z`U4iR*4B0lv3rYgdl}7XD$OJY4=6<$<1lz{Yn^^uq&zdEwOBcIaktdKI zZRid!s6EMVrgtqWpF8AQRg1LgfU<#l7omu_E5wp)X8BMIUzr#)T;n7VlF_vL`*g-Xo2>g50g_oIqa9I-Wzl zFe53jDeEqU`KfwK)cX?$ufEIJ78dhS?9yW^=-sNw@4kM6%!MusE3~@xBhyp09gMNYLg?7L!dGqLCI;OzE60Z-c$2;8Ral8$R`Q zP^RA`Va4E^O$d%?`!yjeP52&OaV2}Oua#A(7C(nrPiuRlGmF%d6WNZGVRZ@0P?6?# z|7RJvaoe((wMvUeH-a-a@=wxvzvtU+U>3$^jM1ECa!jmOwA&L1Fx?qBr z61HVwosK>!+QAi=Rmve?f z9%QX*GyRia_R9YZr^ES5{c>Qfu9!`t?S*ctk6X||Wl$e_&a}j2nVnvftVJ7n0Ye9C+)Cv@u-z?n`)=$564*%{k5_6KKQW}bUfxT&gfZ&tPb98*;XlH{oUhvd znLo+`_kK|IQF+PtEUHPG{J3Sxdqq}wxl)!WK+_ zT-mA8Bd-Bzpu>O10hc1;bp!S{jMf2SgfF3S`KMa<^674`<@y4Gqbl7Qi8I4|PcKSU zE9Pj$g)viBY9YO+HP=L*@Y8)hV$Fpa98s$9>Z#p`rN7hJbR3RIg?)jFKkZ(4%Ds8h ziK?%-3r9^RjVOwoMDQJGkgzTeS#G~6IxbiC~&WoST7SU9NA8w zL!w8pIkd+0y4(z!nq3+AK{sbeLOWAU)ZF+{L-W0slOUlb(FbW=A7-xfVM zZfvSb_D{SQKN#6i&?0v#a?a@iqe`Oigqn6 z|Dy(o?t-~Ezjd}a`dF{5Z#Iy7p5?8h@w_++-v(Jic;XOG;@MSzq<(=QIxC6ktbKCu zbSdJe4Ze?mTdezJ4PuqlgNYsn_N$jm(wu>$(HJY?0BiiaVvo)~&V6Rp{6d3oPNJv0+$FpRRa-P;%APYc^j;CmHU?^3SAE5!nr2EW03s@vI zvEe8n>ceUhfEpD6)R+di%gr@XX@uJrY>FH(E}{om89)tb2iXEDh@yN?-}8jk?*H4q z{{j6M)limaX-w6WMH14$(pJb|6G>}v&6Y$-NEk1C<#|eVe1~C=2fIPe-(|6vifZ!x z?_hTPb2kt!g$f)atbZbnAXcr>hC69)*__dIo5tz%Ic~Uq}tD)3@Tq)80At+C9OdTnl}Bi-O}B=xxUZKR$1cQ zT`O|EfrbR{l|3rib^e<-t)Hmm!{oQBZ3z|?dh)ei^dF6z!71xRFMF+{WK^HL(sGjP_%0?VR!L7k^h}^j;d5jwVuaVv zP=t(|;2uDM&ajOZ0%|L!@2R${Lmg;0sQW)ykC(4{4}t8DGA-znoKJ3KqznlW<5%^u zqeZUl8CU4Ykj`a-7`;e}NOE;Wy$F{QayX$h;Q9J^M3SJ{&Xqfz(kw)e}LJw*7qS9$R307ztK}zr3sLo6vP~JvBOQwxX{O zM>=sHkjr&(&%~V7EjY*AD+(1~WMPa{e%vIqdj*z95?;kv&b@L7vv<7Qu7B!(U!zr= zIC@J7R!u^RfH;dGH22{rc^JGgCa7+XN@bxOBZBj4{_|?(=}F@2c!xJSlUESib(bC? zpmHw^29-$S_%=J=gPs}5f%(?@FL$4NP&&?Wz|cJhHNv%4ln8F$d5x>7^9WZT*>}#C zo9?79O;p+%IzN$_wRz_8Z;yKY_Om8uGOF?ehB z=|Lw~8_)ORmiM;DPi9HIvyujMY)V;G*qF!7QHYQ!XYVl~NL)9cg8ZvmW|rr}`fo=- z&XVmQkB6VMIgZc*Pd*{ZyKgShjfVZS@*{P$r|(zfrN+88X<>geD%FyMw55-g#u)$g zi%}*_*7OUS{{QqX4kyDeuKr|~zxjF4JO!;fqA!cjjmVpQc<{1)v8`EH#E?q6|BHAl z*4p3M7w6NqQ%e8MlZb$Dku1tR1_?CR=B#NO`pAk;9-)rdiZV}qC&Q5Fc%au_>D+Ly z%Zf4>7H_rR23!i?QkrebH174y?2!CK>J@H+9LO9G%E{c!8``s^>QH!t-+w!*%MdpA z9r)>f4`})SYH@V%h-d;~{%fOd1=k7;>(%XSq1_$qc>>w|$mDpd0-Rk?@s&zXJmQpW zKKr~1*Hwm5EQvnF7Lpsdxn6w2Fjtu$e@DWYX53ky@Vn^=ln`;W0r7SWv@yHd_ zj|S4S8o3#Qu9Xl6rpEe#kT6QS8^643h>k4 zamOS;Y99VhZ3@8+4)*F|&_3nBbG_t0IWAG`=-e6;ychZKbugigz_;6UJhPH@ee-_n zijnxIq$(LAEMlWlW)(7l@g30P3$nlqx!<|Eh&8 zjy^1QP^wgLGqWs|rglTHMVCst&ZxpTwGFTT{e(v917yY+(#m!9QfAjc2MfDA^1tdH zyyrBNF(?@-XOTLk0ak&Bw~DECYN45Zg~;LgJ*l(q{wD)ziKAj6n|x{Xla%K1^#r7y z*QBSVF5K(ICznB7oKpP$H)>LHz{i?iDFCy(+3Zl$2|H{Do+M?r*R?DG@oM+sW3EhP z)Qenl^puqn+nZA?xb$Ezv{srQdqE2p;kC93qdWCwR@G8p;fUhQLX|MeMe==mI_$~X zLP*#lq@BcfXWV{=LM?jauCDt0EuV)1aMwM&tP7(m<>Ek+9+7dVxOZS(Dx)V5pInnN z(llZd$>+wYf!bEfgTvv^DP;jwJT~a7x$f>-Sd3xt5tTH zi=s|#n04j^d*htq!N+<^E|0dN4Z=1OEVS1m@hLUMrS*H`k0F#!gSXN(S_n~{QVcij z+4KIYmE!Wr@yEeu@oH)j5yemmzq_KP@!DTo)&c|K>!TAyxK=k+*|jd-)}{9&OEEQ~ zBII#^;^yDJAubb9yY~+8U=fjzvJrnZ`YvJ0|MxL}nXCNsZNAj+qUTIBzlYYm_QfDq z=4(+=wl=ht#xtmufg<)eR~67G_w&D2S6j`}WDr>PefcWmF01%Aa7jg$lfl}5m*W+f z+^-S%tq~tK>{P1|;HRoT6Md;vupHanQ!psklUE=|7|ZkxtGOJGWi*WBcD;pPFkkKK z+_FP@+DC5Q*D!%m{#lbrFLEDtY;moMrQS0H`pZ?xT}IKA)A+;*Yx#4<$3F)&{!e|k zJY@PlJsM+;AvPk(qR43f)}5M~U(eqqH>E(PQ^*Qe?!`4BHYJ?YA1$ASA9#ui1%KJQ zcOthMA945VZcRI_+Or5h>D&HiAwep*ur3z+*Q1%U>_1X+z4QHv2z8Z7-1rR)t|nIu zv)71kK29ksDc(s6|Ara*N&6l5lw;4I;FcEHzvs<*5Da z8RuvhW4;VR`(G4H`5j<84!ne>6@Znx`w!6V42GcootXoP_AcUZb?5%^Ke)GjaA=DC z9i;-9`z}Iwz^ec}$^RhK2ElpB;CI~Zf18N-AJmJ5`77q?BWaC!AU0gvE#}ry&sqPS zk{(3`n${1+AtgMYG7Io80RvAj$1%aJWt0E+4+H;?eCG4j@)?qSY@0YDSPXMJCd?BY zKansKzxl2hm7ImE1}5^yH5^*rms{UFvd#*va??#i3Mq?sa-6zI< z?KkC8V%o4!M#))T?KGyX35Bd>p&3)kkQH8%mf){6Z8rZ$nl`+6+syW|uT8Dv`sKq5 z+_pm@`DQF;QqmvsQk08|mSg7z3s66+j(yAQx=q0Rc`=h@%3Y2VibZF!9^XF}DuK8D z(KYxArRe0{AnkX82M_$5Rhw2`<8q>R3ewdh7Y-Wok$){r_TAXtlpRq!ED7!IR$Vi` zCe&+ik3^eq=EG~G=;dy4>hzw`>FP4qTMzD=yNzBGHM!BDm+@dsrU<_zLz3RS*($e( zYNqpSgs<=I5nlbe+!e{t7{HD!(-0* ztr!7SPDA|%i(D<8w8cwZA6tFizR@dv_36=R9pgBXi@E|o3!Eb!s$*QB9sRU0(oso4 zmVhLbS$^J-{mhz*E_u(P=6%@})C#%#Z&KXdL|KwoQ{Q>W{>2{WL7b;Zf*Tt5}qgkwBp*I(l#A0;0~NSt}ClfT{NfY-1V@e2T7 zRhC>Bq6RV*&`6=N?|6MfvT7_dm`Sewi}sH@KghL(BUUxkC!e+8s&&j~kv9FXhp)!t z`+w3@){w~Bh@9>UL#0&|)@yk+kHx<;_NKHrTE}x&{&8UTAyNuc({!PTXdX^nYX4Um zan#s|xxqvHQv6Sl;Zh%BLtmYcI3(PIO~HX4?83A;Y*YR=Jm$m?Caj&JGR>><`{bX* zoga>_J)Vg%dr(m(e#0EGgH_w~(QiE@fZFj}g-+mtI%|?4s;-#i6jpI~{2?M=K*4mi zu=J$ny)E^4KCT$y{i!MDH8n!CQFdI1`LHpKuRU*1S>NluG86xT&_Q1;!7l02cJMEA zGv_uf5;pbzdJUDs20o0!ZyB4gO&Q6rtL6HsQ2K1)8P0tljljuHxh7ECU z6~evdpgGyZogc^wQpZ%pT^ATzn~#(&uovZ>XtKm%smGk$1d(rF#Y?LPBEv;jZazKK zHCaqkJ4?AiTxUeKx_8R>6Uq2A0HhgoDnG zw6=175eZ>u@r-|B4yei?QisQRq>kTMhJXC>cX+|7?gHoVkN>+|>p$Ryo=cp=Z&ysY z*xY|W77~B57{A{LNVWtBjz6378)Wgn&HRHJ`5)Dr%ok73`a&NK4t6PjEZdm3deN?; zyJhr|CDFTZ$f?aN>QZE4n)xT5=$EKF1h^}~@^elQ z%=|(G#DI%33PiiP4Rr0#ee2eiKtfaU5!N-oI-vO`-`xSho@M|(a4yLI^E&dGDW^OT zkoV?amCO1p79!Fkw&I;a53=X%v(*(%gFH1Uka^GsAcco@wSl$72apWszyM@%9)x-N z2K44HC(#;7R=(fS$s6~#uX&G(wP~5Nc4YYAmaGjn~6KTCCX>U>Pr7ETyv4s zaILj`?2FEn&LPnGWB;b}r*Q<(0tLcF3vsUO|JHpjdcRmDR6s@Bje@d=-n>9j`yGUs zDwgZMp{{Y^$2QK7DW?MD?U3~wKau_eO?ig%gd!>ZuD3@^*#tOwe6<~o)B6>3m8q^+ zAD#&={Qkp*=kSXX__J%0RRobfq3)sX{~@;j15x<1(B=M<1!8CLAemqWU7vr08UC_l z`u7LIcf~2PANZdGu6;d!LIA)dak)PX{;8ep!YUfSp)N_dfa?K#26(grE&qXW7NVl8 zt9&a?hZyqPk0A5Ho0kUIIdCBghu58*Q!+leel^cqzhqWbdEOpJDMv-%v9UIq-)=+A zqBQRAc17F9tt*;BfR(TKAv`_k(l5_>nLnR!|Lvz)diRjOKP-9lD|^wojOp0pd^rB1 zXZ{@DmoK0FCqD3BUG5i-kO6RnC4eKy{|g-9JhRaMPjG~bh6syAAEUh~EmNMXCr)K>R>G>62Z^390Iry=;&> zgZ1H=ec~Bbo>G%OY%_FEE2I|Xh;D(9Ec}&&jIceL0r<;xSr`}TKlwK@ffr=%HjuL% z0_R-HT%OVQtwp$-7NYKP-JVlKo>po%g2egOF3T8*8~Ecl-4BRP*wC!1~A-C>G z+6H7Fm2PJQb~V@xJV)C|?=u}-I7t-*u@3JmJYrjGw9H7Z2uZX1ygnVe`>piA2yOFK zZ!SUD+76iee+aW8a7bwvuK6ic^_N&P))4?9H`-YvZ8@Aq#TG^G$YE?5VS9!G6 z-BOrxg`9k2@!?Kx<95GC&uDE#I+Q2XGLF8q6ss^O=X;^~(LinDM}rf&&ECBnI&tRW zY8+Z-vN_Dy?vy87HMEX?k#&&^9qUxkvi8R-^A6UuV(biAJohqlJ>Fk83^t6p%Y2 z=SuQG=0@njD4C{!@D@>DE2 z#Vgk1qF}yCfPKefjT3XukvJxc6SkTqQ?7Ok9yv zuu-L=*lnkK-2|ulG1BXDH`uKXd19=D+s|lN>AhtlHgsMIuGSk>h)5l*`1m~^TzWZa z?r5DEX3qxE3E=w};2QeDk7@I$U+rqt%er1wHJ^w?$+3-qlIRW6lm2y4@dRiE8HSw( zrMHN9x!sBWrfcv_!H}WZu&{B{^3*%Q1)ZI0{lIwP=YAH0Cu8|KDQEU1XGyV}FMFI; zV}?W3q7O~#@83WXIGXBBj$JdvAMw*1V{2Nw4@kKCLeyioCIio)c1s5;-nk~8G{nzn zD6U|TlyNUP)6Bjo!uK({fA*CtM9F-*45Uv=D5kYg1bqU>vD6xD{{jtozP*3LxaX(? zcawxny)ajz?4zz8>SC>^3$3$YK}va~V`6DuU1XYS=MyLQpbr*{3yZ6bM$#!N>XMX! zq1bHhwDh@I_kSW83f3n(lXcFhkVY!(BHgC9_)PbXxdja^@X>+AC(E1|rOz5SQY%B% z20t^?3A29)8s838;XOH=DYjNp;bXUdP`eLRyk8j5V5;g=$q=5~tm94kv{IPvK{*N% z4i+|vLIp!oWOtqhTJZPza1y8TCa!EV6Bdoe_WZ;*ca@ZZSxRpt=Src#JBC+k8snn2 z>Cegbnyv3EI(lh*zLM&ObEoX%US2dCFNW<+V#zObCHa)P^@L3rw|b)aAQ>Ls#?i;m z2z}ze2a!f4pq1Q~wI~nsRb(0z!1Gxd$CM$J}@>OC&r zwoeDYHyhMc_PE$jqAIAEoXXfcGAiSjUZ&A*#5@4=Dt$PM5n%; z=L3kkbOBw*Xxl88N}J5Us6tie;Ljg?LgKjA&`qloKlw zTU1n`+U;!%NehYhJ<*AC?NBLmWial+eJpbg*@hm*s&u`09B2l=hv(N7JWvI8mf+;y zB6t4};s`D-v3L!3o3bT^)rFDQbo=v$#NIRB#j+qgA+b6+8MKsVm&9*Sac`}0)grfU z#;g;Pk$o)lnRlmMlAeQ_osN2TV8X#^(8>&Pdw|h82uDN0ku!Qia0Ka#Ot~3anoWP3 z0fNL7`zT#r!j+!UNJX6R6(<(<{6J;wk^eZmuhZx-xsYE1ahjA9Lj`H6;_?tJhC~Zv z-nWCzT9)VTZrrHugJbgh?$avC8tCkXFFE5GuX@4;*v&;^BWR?v4V@1`lqX-g;y%a8 zJ&vRgos*{(ceKNg2Z@@^SNKDe9eQwwP0td->|e#9jWyT~x++cg z8k_JvJqS&LDz81DyP;i1^&w6_PjAcY<>G?#!Lq^ean!z#<<98#?jDaX-TPw4oS|Y~ zC9#b+Q2P&U0jj!Ew}}z1Sx3j1XR+4(^)&a9bm%bW zFx|MC*-NI6-#8L!2i~~H)VW>F_%QmG7bP9cHi3?KNJ}3J3c`26<}+ea>2|@(Si5;7 zAbjfB@;KJo>8~Ms5JhgH2`}dVfwBV(LQl4uO~JY#uoWr1W`-W{me)bT2h;jrP+Xm5GKgC7fy;{}z7n!u5i-I-I-;lm(ay|eg( zMI!iWWK~(@j*Ok`q>PLqd5pnl(js* zBQ`z8#mhjATc++kK*XUw+vOChL#CzPS7+>DLd=Mxa`eSmvWwog1Fifg(lcJ^8M?hn z=CiT$UD|kj$wJ!e4C>R>QK&9rZzmhOZ@?B##bZ^sJr@<#Tv$>P(gzF?+eQ1iHFuP^ zFz})zD!Y?nMp0~r(zQ3pv7`qow=7tA6a&;OUTCc|Sj-~$t!^Pf8eukBCnDs>z5WBQH6_`J(?!K?*hjejU%;98L1|{1c{E5cKPveXiF~j!VtIqQN>^@Q>>vxCU9$MD znhu5*A>g5dc9pCa>~C^YEvp%bc+2As53sU;g$D|QUpddAxkf67a2o&$0923~(~3>* zoJAq%e+16RT>w8x+`}&eJw*WmM?CsJswG#=gV*mrhqPKw4)J81T?Lfy)^#9iXoY;T zmOjBy15)T)=Xp7Qbc+t;z?ht6gLeMK)n)dxC)>&8Q{Wl=XYSdsAF7jpeF-{G;CYHB z4>ph`bqHjT6IA0St}`HO(EhiXfBP)|f83j$1zx6_3nLN%QZy8vx>0Xb*XiZwFgLm2 zImyYst=3eW_PnvZ=V`qDPH`2_7=ZWhpVaq)Iq@G3CQONfW1=ubbr-@*F*|P%?*APe zu=GLR_#B08qRG>_8iF}TW$dYfXa(#w28#Aw$md+!MVrl{bj#H^g%i3q|9NbWq1AA0 zhW_?(32})wR!j_2{AH&>m3vC!*v<`s(wX=A9Q3^KqT@5v>@^K<9i-mZmQ2AYkundg z*v~Vf6ZXzbTH8#*@+YZ??emmSvj>?{ug9cHGql~KiaO2cv#?7a9U4(ZK5#Th{WiJUEK6x{VqHWJEkX7t!74v-RB+cdGI>+Zv2Fh&e`wO6HRy>m ztpg2D3E2+J?ve0YVEN6Y_iISpxdA(Y1C?+0j$(<Dgd~MI(nJjzI%fiwsVQvg_^cLh394O8aTEli5+W^NQ@!MTYwpi!B$fFb5Pg*^d zMs)HcL!yuQIP-^dZ=@f6J#6!bf6p8hwybu*N4~qCd*&#=?ddmtrn+%*6MtobOHHS= zrw!Hjdee+Q;q4pC3IVK7df0SE z)0az2t6vq%fQUj4iB0)krZ?O5xTgb^yA(o%P>zT#!*w=-u@%o(H|%?XdnLXTxZOhd zWuH&)lG&<=9W+A@+Ci8IQy@_Zg5YRou0_$1tR6>TgRk-`m?O!Bwsx_jxef|Pr2VO- zrY*;(z zV;|Fn(8UFB0`bGM(z|CA8WsFUq%$YiNo^4hhLeZW=adno*n0AKIRiH71lbb`!m|nA>#f^tIOmC0K)86a`u)nucFt2#AgoV_wLLom zyim}kx^ptMoZqXFGs5C|ga!%6CsJ$5PZ@F~YS|hdwa1KpM=2Y~SSjYkUR3~LDn9&8 zJsBKD8KZ5Kvf~emVX%ACcAYnt6HQ7qN`~(DndEH{$#R7df$Ya_Hz-|)%sUu!rcbd~ z*-v8=FSYn`2ld~{9f29t>l9R^2em6|3X*8=b}h@QPdX>Q{9Lkg=$u+U9%nql+FJw3 zdAY`zr?jDp=pKYErUUHAZs<3;x`%`UWP1I0`8b|cFu z6mR)RO!m5-I%l5bVb$+vpS9KfO}hroS{6FlycQ~Bg+BZBQ2oXXMq9%w=NR((3Nwf%}cY^5AMGX^#h~7ny-bwU6 z5uNCrFwuMO!%W_ld*3DYv+sQGcO1|0eeZtW{l`Qu)>^aHd98Mq-|w^-ihrNAuX$~W zRzb)9Byftp;Y8DiR^*FCzhEefu5aDq)*o+2UUE zpz(>^FxJ~bbYICYn^TZA?kl?(z-JkBUVk$FmEhtIMig%zE`3=4%VV>J%gSDAgBT!A zCT3_0txF226{iQ=@FrQbYSf$erToZa^Zgkh5^ z6fzeFQ%M;WEz_&A_=Vtu$5$@4)lRrzW=b*GdI=GY4i2JoBtO)H{I$Nno&a*G$wSNs zgdp9l{;wwTKz75u%Lv~v zjX+N86euRxKU!Ftf=|&V(ryJWCGTMm0PTeoaD*O7I>;k2&A=9qmprYVyaM34$?#*Y z(<|2NOsB~qr;y(&QI4E6?t-|N$t&nr<1jSFKgd2ez(l`i2{w~+N`(4l7FG=}Zy9bHEOe|y9>X!IXlb_M2X4+q#k6`!W= zgDzdl0)k-$bgtyuC~X((;IU0`lv{0{M= z9hX0b(jJ}n02sAU(ALQ02s$LZELX_QnS)N9BPEzTW~23*j{@Qq>m#IqWHhTt2yYDl ztSSFI(SH0N^H~t%{qP&rG`Wp*!;h0ldndnyE%#|jx$tOSv1&zQQDB!dXF0x_byzhj zjYeaIYmi!f#g4nb-uuF^{nUJ4+21t$L=og}KouOZi4sR%D@IB%b&vjR9ns19PN$}2SQ zCQ*dCzxr%X`LZZVK-hMmPG^{6ddQ(B`G$+(+l(pww+VrTI1tsWe<=bz&gd%s;R7Bn z6TyJx9;~unBHbJq5B7cR;l;3lsbWs5hUvzvPHX;g`f9AVe(MX`pzl zm6&miwn7W{@OSR^#J~&Jt6J<8rwc=n1E>Cq==$%F-P`k}2}@`?G3%ShnW3p`cWp}z zY0560Dp?K9?A$b|{22I* z$cj87ZrS7amqPN#{9vhMV*46(Gb-4zx82&-@{(UIHwA$C+FLi#Cxjl&QdiyWBJ-7T zi&uZ{F>Jtt-sxZXIz!Yg_0l%@Yr;bHznn279F`LE9=`v2)~pCdOsa=jSUSE76K)Cb zDt?=!@qj=Id2RIMG41X+^khllk5OmN*4Mm+(#Kq&L4ym^8-?nMq#+fJ*~WG+`(SMD zguvZpxtMkPam2*u!>hng__PBwS;3g-{GgJU_z z`69aN!L|xBPUF&mr#k^@w=UI`3-mk~PPrjDxIQOQUl~-8;U|5EQep=ia!vw=`l#@) zH!As8%NYamMf*j^ky%!6_${vcIIzX|ev>>;h!3x_Qz$P|2;9esdv1%ZkyYu79*tjS z@OMrXO2d-C)uthod$Uy-|K}w6smXYs$xW0Q`u@TWi)pcTrzK0(`58s}sMMWtl~2e1 z2O==m{_OgHo)WCX{!Jnpf45Z#z5n=kf4VAWK>2f^ueRl2pGbE?9xFHhM;mh5nZl0R zz{VrLeGn_;`A-Ciy+0EVYe&}Kar!q%cK*As2=d?f6C=G^H(9uVeVD9R3gI$E%7A82 zf_^M5LSm1BEgMA1;T7@w?JZd`zKV}_jyF7Z46noi|l9eZ3v}VbM_AH0}i0Tdb>HoR^R0UieUMI_;*ALNjQ2^b#1FUnvrneu0#L|R)1M1(b1I%<9x;S&vxUvt6 zidRGy}%HZ!U%+79Q2iBUu{uN>P2puivjTJ_Rr&#ryxld4ciU?^r40YuuQx zxz+f+_wm>ZuT-H`bbgPUU1$fRInt%{TOU#PS}^mN(a6(|IFh)QO2biGy*nbim02Ow zdMNwF%sga|=av9aYKQDT5={W_W+V>(|8?Ug0prb%IkjK<;E>e#brp+6H3-IY4QHq>Cikt1s=` z!wqd3#mw2KjZ#fIxU}U>wLZ+5w{8NtNkJNJc@jd0R&uX-zP1y1usg9dGgU~~|=>CP_DXoB< zL6P-Amb-6Qb7*W|xuWFj9woqwvD2OvjGgH+- z%PAXc3rRSXVB#wo zQ72VXi!^ZB5Ed0MDl9KPol`S0RJJN}lhHtTw`iDP+6G^UlTcW3^bTpsU4qh^-@1Nt ziZV3}!@kt=yyqG&FInUQTY)Zq3s+F1)cH4*k)9urvt^==>sG1rWgF&WQxk}WMJ?&N zbF9vEIn;i_-b&Ip9$e|9$9jkr8}gJbvUboav$W=oWo}fp@7-q=p}8Nds-8b{Jm0T7 zCXJPp8(99~^YczhQ>$zD$sJyjlA|kgUN~5Ct&FfJjVKkU5~M`V5rvwWm%WxINVcZ3 zD8sdWMv+sp9%P21Dif-`4KyUeVl!@m#KdvP!1=&%Zmb|M)?wco1-O^3DC^`Jby z0v^uAB0@jtq}ox;T=!S_5rPSMbt%>VXm7P5ep|>f+R;NkI7|n#h0G-PL*? zWgFL1?Jd*K`M$fz$T#?fJ%TK7Z!37+l#SJlMCYHgd?*n$>KTUEZh7)>FCY%)p5= zP_&zi40=`-SNt6U?9O*+)idWiDg^P^-dU64(hm$hD=7_Mm{=z`w9_Xsp_HU&y1Ut{ z*g7K8h;hU5mVy%0i-^89D@*1TLPK^l~}43hJqhK0Codky)y`t!0narcWO zihpn*-$xpn_zlV_wec~<>1nQDxDD2`&Y46!7JS%v^iGFhGp0)+^czbAQmN#rMV~r+ zE3_7|J)gQ#AsX0w0S7J440|NnHzO0W@9L3k3ZF`v&#*q3S0+4l4LDb(ZJf7FFZE$t z#Mkrr=Z%$_dAiuXdMSP?JGXLqu>p97&fqDua0U6YyyPgV;N{S`Y|#5a!vXd$hzPtL z9r%(#?*N5rF`MnV*ER{+8m|U`|45htMX-ASA8sXC9g5&Z(i@L8|BBB zAHLrL$mtiJO5zh~-T%-)EKZEidc)_5$g3QXvCD+X8aP^ALr@;lDAs0qrZ>;{)vi3q z=_2mB9-0*ycuvGd3fPoiyRM?WufP!CdV;r~V`wIU$CWZW*q{>mHS7{8|0(^5-X3{8 z`jqLnELi&^DD0cS$BK(4%^F#D3ERhOx}%KP3ekb}8d#rf{g$WeuL}D}UH$*961-AN zNd3waG2qZ&6go{wK%y+<(L}37NPMt=d0hDo8T(T=<*CItpxMLXl<|}@y{QZ1Eaj-l zB?6XJON@6NjpW=IA4AjTXuSIifI2P$Z~$U&;hUd-lCKe2e4-dBQ z*d=ynV3Q-0m1INYOMGc>3aP7#G#tDp|0+mZRHt`VNYH7TYH$;60{&y*W++mi9kd_~ zLpwLAr$;y_7&jT_qEvugW(j&=2_!2ii>IfLlR|g+}k*E&ym7BI(T9Z6N zIN$J0F2Lv*6sNjBPDCYJeP^fTGSYK&2=Q~RGtx!wUq%KQ__QP%Io)WtHN!8g#dbJ9 zlXD@^apeT(2;sjb_t2^TlTctEZDP3R5gp@tUGkfB58K7|5Y;6{5`V`XcIJz{w21 z*_Gll@sF%*R%sl}HXfiNu0o=3NgS5o(1I*^A5a2U;p?s&72*aC|u@? zXv%+Mp>E(k3`yii!wt|cMuzd6?H<@$vm+Dw^LgIhcQLJ^&y*sq)AisiHE$P4@+A(; z5zqM*C$M_|QQyG7PY_iViXJVp0b4y-1gXhI97ubXX}34+!R@93ioCnpI74`-f@VCv zUBQLsZ%6wenN#Zp4!nTEf)^K^OqOME&|h*>%E;lQ?bFA`ai zIB_4b-{}u>7LMC3%#hE}6<(M~vJOCl4uWhJ%udD@8Y zj`eJH$Q;2D6LUGxO^@1Qd+vSmBCOLycO*$W z92Z)@9J4fXAwRx{^ELe`#2Hf*#k%L@IPiF@+4f3DvI}X05z@cFEnj1FLU^4nMqfMq z@kP4^`@p^S0+GTS=>s zI0*39mm19qRi}It!dg*Nr-1<;VRHAMjd!;+KHZOGFn7f#3rpoS6h-e z`DCuf!ysqeSz@7Cs$$#PPkMc^i)0jd_-1*@dtYi%cORXa)pH#$+GadN}FO|c5 z(7DaqI#t!b_QsY<-Ui`K>~#cpHv&DqMC6EMOJ3%GwuXqRlST z6Crw{!=`Uf)6GM5om-|54&!_wFPPV@v)gH4*a67CqI(=nK6h?S&kv+k+qSv2SoqQg z`UF{s<3Ew0_q`K@BmN_BPL0=WhLE^~$o*ShcBE4Uydnk~&%t|YrC)iuXIk%yBzk=G zEr|znmw5W8mFz;})z)#W*ZQ0D^(E&`Q1r5uk3DQhFu7Vh^=BzZ4+_v;-Ssj}HO~T{ zYlkIRQM5NKBFgX*lG-@k7)hhjoFgPh))fIArSA)?TuOqh-kdqw0`tK#eQ;Nl`iF7g z4|)kuk^Q$r#{>f**}I+`65h9P#yAk|=jXP`MBu zTL`+d6ukyN1TU;5WUWU2Md?@yxcK)xHkH4GLI#=m3otZ+=S993QMY<%h^CK48Lrc}1U5UzUxgE>DIx!Vw zW+jS8`vyU52dT? zK(lp$?p=AJ4r>#gKv!|?kct)ow1w7p2=XxE$5&&$IrUzLuZ9D#pY~|5w^lTBs{aBz z_y_Xi!wR@_9J52=&K7kwBpT5I>C;77YrD=a5fxUhIF>r*1 zw%WAMI`WMuNp%$7>L7O|ira|hQ%s206dl$JDmy+-K&U=q?NLEH2{5`iOtOwV@g!$2 zu(yD;ZV6qvIvvWrpOaP+CzRE@UIA;WGpY($>3fxYvj_=Nmd6QK<&1;hw|Ay~)j|GUxcJw-`d&BUJ;+O3q~4KQeds85O60^qcCyG%NKdL= zf)&r;wk4=$PWpfh@0^I7VE4c{hiIb>^L1-*(A$`ECWHQNzrb{2seTZ+^)>=liK9uSOdt+6gLxMoZsEH zOIn!4r2>pAScoca%Z9i)gqW||-|=P3F+M19!WxbiChCDw@tJIspC_>=N9?~0^SbEI4K z$)nMiwuTBmR0N0()V}9_Q?ACeqD~CErg!wPl=M49C9@d^vj z=zPt25w>j;$U(|W?{&q zkE$TVOT%<*#`!yBepU)>HRZ&OfU2O*QbGJv^NHSD`V*u?BJ+O06C2n~KbRo2oLBuj zWcbK@zwTS5Cwz}dNlRG)M#l}CrpHCYC5J!&SH%M+bO49sDWmHn05J?-Aw(V($8n)> zu`CrNUfEV#4qh#S*;=x8UYTrD8Jweua?LwqQ~sR|&+ZRw^KYhO(wKrC9>$DP;!@cc z0)B0EDmK!saMBzVUdr=>9IuTf{2$sf*l{WA_YQXPl~OtJOo<3R9;6c=+@MRg`5OLs z2Ul$NJU2blpt73o&7Jfbhv;U*GCN-iqo(5ZRnH`m%Dc@v?zf-R?##mBZ{JI*vEfr* zjJiv~7<`vHr}1&EmyAzIos@oMXh%cp*QM6Nfdu=FOD1M}1IT^O?Uje)8SBlHgQ^M> zue}%|g{y=rFl;^dR#igYz8tW6%aNETZBA-tC*RISAw~u)H(OqF%zkg-I4^Pu)x^ zw`o|=!Nt64pn^vuMW4NjRG`V;F70hNZ!n{E;OWFY5&AwF`bJ-EL^gC1V0#^m!pF3^ znXz|9_m%_QhMamQ7Q=-?OHlcf63sj$VP5GbVSz{mGXxTZCwK|9B9DP{glnvB7ME;? zd8qG05ykN{@)aC~WpC}V%3@0;B`uW14wLluwN_z&jCE>^?GfI-u?G9gVTFYc`=!P{ z7Y>O9zk2o^B4`;EGR9OJ^96AbTl>|rWeU;?e`LimDxG1^+Nv<<(WP%zN?8>xxyyNu zJV+kvRRe>U2&vh4_&lS{HMQ(8qM`f0y%W10*Z+JHm%bRx7iLq&?E3h!( z2YFGVkK0dKFPtht*Zm%a>4dre#aJWIwPVt)IA+#d9U5V-cWIhfcK8 z+%v^rTo^a@6Z9Sp(_k}k=Pbx~Pcrgk#!^&BU~Gt(oBXLw zW1z{Z3W0HAGaDOKlc+LL6E91d5XU{D>iNkpkH^;Rl+5<%R1^3s8kL8<$&)BwDEetx ztF+B+iFC17t7h1nKDXj!P8#wZwx&PKuYbMK;=V0opCY{J5nz*pHD{jwypu)2v)hGc zh^kmd9HpMuT=%HYVxW_4BEMWoYIu`X82?dF8K_`Qk<@A*!3xQI64~PpUv|=;bA3~mywHC<@bS&qMm)CRcaX zz-zMesZ#oIiE!z0v-6?zv^JRMO@s}DVS;5D%iy-V{rF;vPF_dCrW?0*c+pBk?v zD#hsFom_|uGry8l5oKdpRJ!qb<9n_|gK9G3_A?(!w{Okmlx^q;7H4sqZahU5pP*l9 zzCj)0{6G_~#~}7F2BDjk(4%>41#Q|KWP8wH-YTiMggHXfwWGNtg6GV8nGM^Y7q9A32 zCmV$5yIO+^s5jng=q=>F)dJxJ7kmjT8-}ofZFh){xdTr##{={U&;Wx~0r*A#+X=Mx z|IZFCa(ld>TxBYkCELGtKh3^YNRmF{EiQ^J3$V3*o@UWEn3gfg@zE^KJx&LA5r^0x zmj53r_}_h~;3t#^6Z@-fk+^#lg~CkwckgQdT>Ewote4;fjTQsb zf-N^Sq-bb|a1E(z!uHdcB+ke}VINs9hDw(CGH?G=UFI`mEzI>7g{!qeOO{;{3V*6i z@$*=th7=@6R*rH0BdY&bq6*_1j~bfy6O{eJLfs*?BengMS$NM5_GmRbwQ6NJO3j6u z#Iz;6^q;7&O@DTkW&q_c{NG0T`{Q8w@A$beH_WTSW!3*xgZ;@D13hkvci#x)$X)wT z8HF%65U2wOpXRfSLM1X6A1M!*ZnMthwpiYz9oJku1nR@d9*F!`Ir~JSnyi#I8d3yO<|fzn++E|IiWy>dq#a&8WQUnqBu@d=eG`1PmCrn>+}E*?^U|OXUnWfx zc<%km{q}(9q&a5cL?g@%Yarj^oK8B1G?o~{?EA$6t~~t{kL&ySlJ;6BGTP_^00Z#= zAOEy7Pq{=Z2gNIy4U`UE+;sZAi_l)i$zp zhgWGHAM|Yoy&PeC(=C7gwEom7`-&ET@4UK#tWP`??8Ch_t;OGq)DHn)T z`um}VSr$#)ejKC7AQyA#!Y78OR2cGN$*$2NcI}I`LFuC$7YM!(2*H&6WiGujKRA7` zDiFL7a}ZsHT8E-h(C-jZ$)6vTzX9x>k@HNYVp~lcT}aHJN%kR$mU%gU__2*P+g-|6 z4U})PdldGv_O+qbO`;WgRlgkS6Z3FVmNBXe|++QMW}*b&ee&@b2#MB$zt)VS8SF$T31^V@QU8g^X50@Lf2yRecYB4EQAO>@q$3^rW=9-XhxTpxyA;iTy)+9bpCC zWwZ9YQEA&b#*P?<>~G(~1~Ge+^(6tok`N$CbR6Yb^Yf?S4 z{&lkY%)Ab-w_gmD=$~2OXP3KzIP`yGQ&1461sjZL6+rm~nW*}%^jTp=G~Zdia-nYs zWJ2&#ACcAeSwy0Q&~SZVyvQpm5~6r?XCYEy>054hx>m%Q0GX6CJhoN;ZlFAM!BmY8NlAcarHxw7w^;Q;z^v%O1eb$AtFXZ;Ty`5@uM$F)lbxdoHY;+rl#e zs5=fElJ~9*!ZyD{zC$!a)|R15Oxa+o{tiKx>892LL^QBnL20Mlpekvn*=eXmCe-i>?~+qj*HlMG!9X z4NEX}3vueHgsuT6Zklf0*AP<8(uG{<8pf)IU_hB6?B7yGqM#??GJPh4o0yB6Mb?B! z*L;)e7G0+_n~%a#+%^~GseWZ`RQ}65>sYxJJ&qDI+KvjRY@358DxV4D#b}nr?VdO{ zDh}@LSM>|i=l0ZK$xbwz2NG^$d{GZ^FEexsDlB~Bx5ptk7PElgKlvzYYiDFXqXX&L z-zx5tUus zy(w8Z8VTaVl!2Ehgj7eKBu1CnclcIi_$8>k!Vi8%Xoka}Lf0q(n{+83)T+WFFCewT zI<}Dfc7nUNTkmh)4(d$s`oW-VsNz^La%VLStLYr(E>zMpC)RO4|hsvAML`OjZt(0<)=xL^)m6%{9pRWd|*Bdm%)gy z`$BEivaqtoSZlefE=&GY0N?SONx50HEn{~Y0SSBG;+8!A zdAKY)Y*W);)(sPic^-)5lNs!2y$oY4=&Bd?^zLh;K5CKI)DdpS8cHBDUSB^XVk{e~ zqBS8Gp~Xy@r4X@5J$VTI9mVGd`whF8a(_~+1BGAkyw)jB=aZM2BFk8Edr*Sshu~Lk zgLW?CEg6;!j=K%k=G3+Ay(uO};}Dz#`-I_tJxvI3r#8jxsmha0Wea?Qn&M*Pa7jwp z@Xp`Q5~^4`fp4)V4E7gH)?PI-h$7t=>7sk%#_mij=tbZ{ZDW!4U%HkS(F1^)Z+hnJ zt~3g#X*`q}3*36xTiSQIAB#x@()vMos7`!t&?-HAe0)Cbn!~p5t>XFaTWR!n3nSJq z14trpd~K#k{`HbG`ei}L?=XBp)ZN;8Rep!tVc(gzl(_lETlO2`j0F6gcDPG~!x{C& zqpP;&_bG0AzP}|i&tfcRM~N9OxL2U}ua;K-6bxMP-`rdvtiHmqQBcMu40_Y`SAx7@Wz#c(Mo)1olcYs#hY!S)p>xJ_|-*) z<)!JyzY}}Fnfpk^nWsf##DJoAxoP2!jW$v?4xSvv(fRbv38&ztGP6Ci(5W0E<~V6K$BcJOZx_%V-n)E{ZjNSe za(ThUZN!7$vPWRQ***Z4qmwAMUP$lBZg}tG@x8Z{odkAn1oy~uhwXID1&0DV?dYN{ z85zRG1FwXSeWStQEp8CvXJIs297n;~-l2@ljNr#(i7!ao9=K(jU)8)=hluXt_$>Vq zn<{fU!OinXX+U`hRve-1md?s~8UgXskLVg}Uro-q`}AghRn)<1-T3<4MN&$B6BGk* zyyd4>2?g1qHOj7*hri$}E`8EK9neu6MYUm*MIme>!EzW^w&$eC+uRiQoRR3gNg0BY z_gfsw-Hcb7UC<84swh}MZq8y4s!K9EzZa(h=q5!GJGEg`D-sig@+l6p7J?o(&as8n!0%HLU-dKmsdl1Vpp!Sqzr7a5c$t zHM*LFIT_{Duu5c^Ma)L$3NX|11lvb7&h za~K!W4gE%`23)=cY(lZTz7w=T?DHZ6kEA50cVjQP>#=DiDGUy=O`6CIz-CVrO3Otf z9%sXDn8%#nI3TtMFq!2IPHP4u=oaKYI?AzAa^Mc)XnUZ5qi)(q=@?HFAJ|cG#RF?K z8epz&lx}zNl8-3P!88F*swU*sD&N+CTh zdk&W)U87^}Y3(*HaO-}GzxkmI<|9fxRB`JApJMWCiTgX?eB6O&IF>3YhL8DWq?^r3 z_pR;CM`dcMtCBiVg{EObU*(l5DBk+RzYTt3B#g_&+p@`sCY!Mb9VSkzGOb8u!t~7m z@CsnMJ~@CGW?yTfwz!<6V`87#-Ccd%j&4#BU62P5jv_ViNeT-ZBc`0 zVnFi-z-Z7Tg5+rx_)lF1DIoR`GMlFmU`p~!3(qp9`p=jDN9_NZaQ~kzwFiiv|bAGV&s7zK==5EqMY3}I2 zSB>Y10=)$Nv&Si-r)Dk&DWYdsW=vzBac>dYzNQ*3Bi+7Sq&u~$9FLO;M~+#A zg7#!aM%}Xi0_lS}8JaP5PDHXJo^4>*plV@kT1IGT>|{_ApPBh5+DOlCSCayB17GSd_T^B=@`T&wRjYUnrT97o+)-UsF5I%}R=fi)~KWr$wMkGc{u*d%f^ePV@7?XIpFHsaMrT zD#9K=J&im!#A*Hd z>+A+L29x$QEg9B!`bVQ>7K#+Rkx545g51c^14JLp2 za?0jVOGfSeZ-ItM`$gjX{`u(MIv>#n1!rsYJrL`t1AH}oMT%!{MI&X6@TTNcffDMp z-8-3Hlzw0Ao5E983R65!FB$Q_etBn2qgEt6+%>|8Mt)iAj@qzJTIXF2QOYCn4Xn>g z%lK(&T3rkRz;{os9HWa{nsh4~Sr2~(`E(+h$K8rL=+faOInMYh$xrLcdr`}tx+tLR z{bbxXF(}%H45k@8BC-9VG$XnB;7~e=Y*t!tA-HT%LGm_cRMbm%>Q6h*wg$Hjry@Qh zQfzg_x7oBup1*`)wTBB)ON{s5!R~N;(V|furCU>Vo@l=)WmUjbQ0<^L?&Al~qOTAu zYA1nDpBkV}o)e@`;^fxPwL9~-&@c?{rQ9rf3cb(Ez~s)^ECHSd(3AvZDNH?s@WIB6kkqq z4+SvDPG9MZL8;XC!ba)_Kf;#qnR_qgvRy?JRSuve^75L$L#&IK(1DYZ2Ygwy$Rgqu zoN?2qwnz!WRq;?tfRi6Rm83=18GjaA=1Uqo9acEap8PGAFFMQ?BvCYa1D2C3JN9$h z?UNkX2ne*huF4vmaLC2^e#E93zh(W9L6L&QMvz;jXO4B>9gA@K56Y};1#!}xP~{sd zSDc4EfqN{QfzA6+y2XB=Ojf<2PgsZBNrl!xE{nEhFup_ve$1WW(51x5q+WjaYeogu zv4qf-RmCfwaf@XEvGjwlqc^0ly*AcHp(}yJ_#>(bMJJ60HV8YV<~yRM&0>xsdDIj4)@) zwld0GR$C4pDwv*dP7w@{cxPQMRVObNs1!Ki2pdK$5c`AOL`PPABPDvl!r^5n!Q`rU zi-fp;{hZegj3J`Nl;zk*5vj z%}22Dd z$O*dktvgHrb585p{>RZi?HY|9VskQJ;wYwpY8LrY9F8zO3Z>Ono#mvOjQ1(&K;X{_*psPxtK|?`7rESLNf8 z!y(2TCOh6y{)*cI-8?wtP#DL^)_s&Mvsa@6S&y1ZAw3o$6Ya zcHY4B4t|d$8oU-Ksh(y=HLXm>)QdM)Mj6essupLDUhVMbkD`RsZ@%*qA=zJ7Y=64# z(plVnfu{fdmbgPd#Vwv9ue6lS%_l20mM9CfxE&iHUY3+Jaf}(xu_bQ%SlO|ulOCe2 zyx-o4uc&3Fs-VSQa3C)dZRRiD1__5SB+ozYw_L>6v*FZaLt$s zW7v9FSaJK|l!6d>Zj#z)k{L@qd^n|}0OcsyVIWHtE`3dai{jiT;C0(66kJf$mz5*$ z7dd>-&@cD6YZvVK=WLU1_a{5y+gx%qZIHbBB&Z<-5_!`{6$LH8S?g}`U)-nQU$y_t z*<6Y4e%@Y#!K3AS$4nuBT29EUfDAYNbyPTRfFv_{JKYYUh&ytKWpV(x z5WXWKzkW?8c^Ylx&k8>f{|-T6gUH$6G-PNo7jSyqW(zk81)Q4DQZq-`o8xF^K(zF;(3sI}a1f35 zCHaTmEqQ>=R_k$y2IwG}l2hoHk7sW;kAE(!RyskHIVx$+XyzDgum)k*2%t%t8!3pK zAF_#v%;hbzJ~9ls`WE2(m3k}0Nz}@1{~x325`I2SU0#Z?)Ktb@l2ea%!S@kPe@={T zBXy7t>=GWEXm4WRaee(WXnW`{(Dos0k38lN&^8Kz!e#`KIX{86c{OL{KGuXv+Z$Qm z_I%asJoEO+@`-Qp_Smk^a@9F2|i6*^8+gl{|zgBBneP1OWa&PaLei2k(Bjm$S8Mz zui>u`!!Fz)YI$(uIk}?XWg$gLGi&@ESrX>(&cjJHtoky0G|>qhi7)df7X0Vo!*o-* zvWIVH_3xeJJgy+)>u+FNm#{#W12`ccPM+8`8|LP@6z9mV%=eInb*P8ALOx&8E-?)Tc_VyKNtrJ=2NGE<% z@%HuT?zwwTvzhMZi+?Y6cgNs{{cFt^N>`bmI@6c>7({Ho7xP6T`^7WW8%e?>O)vnU zIhEU&23?i{m}vic(DFxQuR>)s60Y<;SCdK}^5DtL5D_$^s(=HWe(87mx&UV?~_Yz;rpnzBZ zg~mY9K}?%H(W#+d_C`0ARw4gMyj*dm`mlu*wE_9PwhIbNA~_&$z(!$#(K$8uHGIS9 zedKV=&)zB{alE0Mj zb(BQK-k0HihXpf@e9QKj&1CkMlgC-qf^9V)OJA41ov&gRHQEzR^V9@X1pivVipX^W z#4GnlfL7$lVU_X)+okjicu_)zRNjNM=31759bK^n1^Pbko<`my5c%bTMb|tO{T-A3 z*R1?uggmo$^fDH>vQ@9A0&w1OGt&dq2u$Z%p@O4kcJuEw8I8c@Ye>WkyZD zo{Z`&RU@^|)Z#6DJY~yxj;SYNU=;*18;v7ne*?Z+z)wWo`xe3NyYX1=v;QnOqSxJj zFmY_6@4)^n^(JF z@<6939q~Kf_6#<*Y%d-ZfFJdtVl0;VQJ_29AOo*^FYG^E`5z;d5;M|_gJcE{o{!Z* z@|y`>gipkH$JIE@IU}nyhVB;^&^+@hnFAiLWH1|x+(H(q&qPD#WNfEt{M)Q$(s(Yv zJI+SV=|ddE4-N7&jj*Iv2t_O&o#m9USs+K`^sC&pE~u!0DLogVwG`DF1?LFv&9~t0 zV8L~A3jZx*Iui;jAHKN*)|jaOHV9RKB3~SVd$tg?L~j>OyCne(%}%g{xQ+le z^5^>UsUiCz=)@m1=_kA(_-h*Qrkj8)?0>aM3v#=I++D?B{dJ=6Ai@3(oKwpqVEIG- z@BISvqY!ap6&=+tC6^()G2yUl1BGtdU@zxw?St)I*SX|+>>;!o`SsY+#Bvi!A3^kB zv@`k;sFyWg&e9UFmd5#{t8I%>+hoyrC8oU}1~%?1U;Tj7k#MylKF00~`>9{ZDV{-;cD|&H zxE*|)hOfTd&^pD;^;!IuDB|S+aea+}Hf(l?>wy35Mxm+w^N6^4o@YW-U@=rl0X;@r8yBbn4A34yq!y zmkCb-PIEPpydQTTw++!~?6Yz3-V7&SAY>?_v^2;IiKH33nNor7DIOZW=>EvaLt#BV zY!2TxiQfcgS#6(MVCtQ*zaiEad`*`78!gUs!QTciW=?7AG>E3Ska%IUhcys<(mMYv zTw3@_D``~X0q07Kg9j@CedTWc%a}-}u_kyup4K_Pp4mW$O{JcEy?nu-rY94}d_2V; z44kAO=Vu4JH&rbiIy>(Kk5kTR2_Wo3*mx|v9Tx>!>u<}sQ@#k!uw0y7FWjs#`T7;I zoaE}JSSAD0S`zv^F9W~)ye@8vW$o#Xf;uW!C-c69O>OY#Vp8dej`^%YO?hxXc{B^h z@bvh7yZ0Z@PhWV4;4)+x{49m@C6k7gd(PEqMoRkvJc#pz=XpJ6xK2)x29KmZPD@ z$KW0D1=ThIVWKq)9u5L6sr75)%UI17?=Xd3)YR_My|Q2Kc2kW?xGiQ~?&d9=5pX-q zvwaEYDRXAVfsc^Gt-S(~qP1t07AJEFUCj6umptFly-c6o%WR&xieC)Z9 zSl+@%oqhmPt7~~n405EnIloX2#&NQao>-)O%Y?5*jhx98yj4MFnbr28-8?^FfpcqR z@_`+J-R(FZ3WkEr5su384Z|sOrIq1>j}H&#E>54%yo)O>z;Ib|EBR4XwnhK)j%?MM z*Qa|s__0x~6vDJIqeSCH_3^fX6O{1{4543L=KQt5N^Avc`0q`Y7Ltk@x`_wV^llCGeFCDh*aIxDjk38K#C6CWW)bFnCM-STJ#DF*doBm9q=(WaW0as@cKP&U2;M zG!3l1J5B?BmQ8#;4CWLE(MH0=@(_d6@{uX&#n zx|kdUTQQk=KR-$T@bp3ty}#k|)d<~-IYl?vdqrw)+`sQ5GP1Cmtl6F$t-6kc#d>_3 zu+-d-mkpm`KF{BH?nz>s;|7HY;iEh21~bTMH9o^dHpcRql84wXbo-}1n%Cs6572|q zrP(I$#AMh7wUOYe%_oUBSKIEbnK2^xpLD8Y68}SL^t98)!uamMYU~dR1^@Dpdd z8Bxh1l5>)ra~4{Hs6+wDp^1_~vLqW+a?aQwEkTgb+m%+$#(;jw&dFk&x{gt}hD!%9Xlb{g7m?=WcEN9Y?o3 zTAjF4mN>Ln4nl5urY?gVGeNwba`0}ZC`+wze}UPpBK#$qs>-}gKFgm>$YO)Q9YCGQ@!KLww$yZ<;+c|q-vcd-YL+R8-d2Rb18*I1UhL$-Y>S#~( zmQV#TmrP&2RuyK3;?ZDp+W9i;Q_4PB)H~JMU=SgZq&&%2Bk!oZg^nQB?k0PE$I=122!;V(rQFIc$B0xC{H7+fN2kxdZbV0+7=}!Jf%aKdvItC51j<%-38uYEv zkNK$`q53hDskHG~YYg3igB0em{8iBow=-WzDcU`S7gq(2-uzUF{1`PoMathwE*Z+) z@!7d=KM}gjKT51X`eoTB0{<=eL zAgP(B+Z*mEGQu7i;cVi0wt6LSB3PA3fReQ+&!1HeaA|1t!xLM_|_gM z;P{FJ3;;{kzfoWi8gpPMw*M;I(ejZ6@?R<2@lVVwwP%kLn@+9cpz^I&-^?UujEoH{zt+7?T-c;XwO8q+CYT)n`q@KGO1IWrO_@n zH&Z$$9KWfgjkus*#$>!9e=gEWkS$}dY8W~*S(At4#YeKLYU(J(PQ+h1;er*pQ)&*+ z@-n_mIfOhpnN%~Aq*j}7!!%6W+cnJBXqS^%*2Zs1&mK?qQ}t+$!X@wBs*)U))B0Wv z-}YghK4IfN=8AQ1WN2$NBAZOeX$7c2hIWJ%sA7YqU>Lt3q9pI`uD={{!i1L-)p5^2LO*wXU zS=d6mfjz^xPxE$g{;0ulY|A4&W(DU$%N=*> zySpq=1a{=~>|SwRu%Cu(m5()wTzhoHihlnk*W|_97#1((&+f0t5@#K$L;0$Y5xu0>)S2JHARx>Rew$V_DB zDNA>W#jq^$h1uH+q} zJ;nWGda%d*j+KNy=dhVvoMpZQ-8l1Rp92%fntuE!;zLLXsp}lwl7_}ZNWCEON|Fy6 zMz)Fst0ouKW0B~OW@?OUjJ#Voc)r2lIzBM9NB;)WmE!$allk>Qkj8CzY5P!U@eL@F zu{~{s)380AP7`PZ!XcUAA?LlxI%(@ZQn_OoQfF(S_4EL5EaJcosBDpeB+cPU9oPfA zd$bs$z>KzY@*xG@G6$VW&(alFWu~O(tZ#fPmoyHsu4)jA5DJ2y>Iv4kux1tv6oypb1c%a}G8|I$Xk5-=NVVR2T+xvr%T1h)|4?2ZtrDZ}{)cmh~nU=Jr3c z4>BBV048~v556%2N=jXgMW#8L3$OS1$lO545vF~vfDbb4qIUsENtx-E2`CBVS5Yg60@iAOkOJtzBhV)}V5@I{{x(G= z&HhOPzySeDiI33>tPDZE;`sm)iT8&j5`XUV52}Krok$_2F^}UAyAwd>`zY-}-O*0? zt;Dym--0X|usSoxcma-eqI7I7$4CZ_^b&StDz2)3&=t5J?c}B1(YYLBJ~-CN-v;}! zD*tVR-8_@&>}hg7#`UbULzGCAh$fcn*I7)=2mq>w3s}nLBKxI6Eu~|x9;-{OI10iK z0H99xUk9i=&gz<043PnW&>Oms1~^=QuRaYCq_$+8qdlbtvi??ai(~k5Wf9AyS+MQ> z4nd-+$aytdl)u%skw-Wa$iG&9RM|dc)ZVIJx$(y1cGjNxH|iowIU=WsJNod&$qf#^ zk!j|c9{vwgLB1KU3fc5bZFS_z{HNtD%r_q)=#liNv7G^#v3A3Dhh*NQwnDD#4j;S> zkMwHTOM*OQr-N;Q)n&*eMK*+mtA*i~4L zHK_(A6`iNkM2hU{pBTTVt8jhe@(_0%%{SAPojDHR&+9rLv_6(BDQ*hM7odcRUTv)4JM4|m%Up01<+3_G$`hw?b5T8N zS+9#OLDz5Tv21~JOT-0xNt;ulp`*;UbRa=er@;A3Pi&3WMZ*B7wkp$L9%;i$EPD0J ztWYHbo@Hecst9AQe_qO>Sb2M89;$ET<4p3gG3s{d+dhg;w&kvHiC_xGqJvB{Rn)gHDEU~96iWuB6vY2}YT6(a8@lByx*60C*y7Q|~^j-mb;|iU< zJW|)CbffYqBLhMW&kK!eX=-FHXWN;e&oQg*1n-o_Oe+clmgnAb@(<%uy__U96GAh| z>Xzl-p7Vr`Y9z{pU_8fqj2PFW@CcW*j}hiCdbo}gav1be>l+`aEnv)3@D*$(mWLiu zc;-q^N{xQ#fFP4z8uY0rE~&$@@ChGphxoQGt3ME+*+q7{scQ5&8>BZnL)MZO9LGI( zW8n=^yC4U{;pVqMy6sn52Y1)P)~~U7_2Ysn(^>FwN%zwey^7_J+a@ZJz2X;#6D%U` zOdF2S8)R_qH?9kdm_288lKdnt?bfxj`Lz~5*Q-%8cLuM&_>OfkHnQ}ft#GOLX(}=J zp6H~(8PN_Zgn$l^`YRQ$vlnByi-NOC?I3Ny7VfHiPCueO+-h?r@QefrB;wgHefhJUBn!HqACV6#O}$zX4s^($nWaxsyP? zR#}Npu?&o&?Z*wl#pBL}7ID5?Oy#Gnf?E~IJUqwkcP3MdAwlv_qz;~+si1|G*S3CK z`J5!a*>elg)^Bz?xCG*0v$a$Z^Pq)1^;XW?69Rx-Uugu~Rh|M{h|xmWK3=-ry_D#i z8N-z|*Q9$=`I!VZ5U_)@P;_?DKDgc7MS^OQ{NQnn=+*C7j*uATnjv$PXX)!I*_^wC zbh6h!gi5j3ER|1N}6s$X`iB zLOoDN9!E*1!U1&Gsh}AF9P-{umc@~C&O44yuN20GC;dHO%gJwI-r9&_ za4Ppj{7!PBvkf+`tK(qfqn6@Ws7?DOTsXe|n_37?&v2{W7^P~o)rfizUFsC+PLKfh z6P$F$*ZTwe#WdB^hdS4FznrAnYVq6FoC&?th%ZtDwmsZ_sg;SYNuAy%bq#|tY~*Jw zuR=X_1qmxKM5oe?!fEbb}9e#7@Vj8q-o_Y|RK19tvy;9Pr?Tw;lU@tSa_9 zUR9rgUXHMqo)fO}ayv!oJ)cd8|5We9!-8Gjzi6zg$k?4T82@okW6bBrjjk**O$RIz z5G&iL&-dTTzn1iEe%>N3#*9{e`a8>sIZFNyI~{V(_|`(uCrD~5p9eIx&*^b=QM1&#*+75UQUy|bXI@G`w@vTm;CElYm?I*G5IR80Sg<<#me z)NUx;(3y~;rp3pLiL+qzm*Nf%)^nSX_r?aymamnyAGkS>re!XU`5tP_-6@ z1hWV9LV)?>$eWbyT%ZY;dzd<<)=1EJ(k(*8uW^5%H(yIfK-Qe1 z;=-w!j`;a1b#wf>sT}8gEp4vC!N*;7jSn=D+cP5G!@0Av##(d^U*EHIIN|1O%TYbq zu0^*Vai)l)?WxmiS7o}}jm9QE;(`YmUhI9YdCLFRxZmI_EBF#wtFkp&hfFD+=IchP z`-FXGV}jnlg(fIoFsMmCX6vJ&L)CD2nVtMu@hPGwd&*pyd6y|8vbhyU3b%37JrLG% zUAdv>?+am)2Y+)14nX{3amdE=)6b51so}1J$Ij9RFq*@HcP!HNsf9|{(8i!pG=~+k|A4)c!Y>rqjBCL@3Nohf2 z@l)k`fRyF^lsdgJ$x3vQc9QT7lVXe#i;yL=ta zOt{WO$Qdl747es0ne3`VTghbiR3GE+eia%*{JTxXey-Tw;x1$a8teb%sVUle@1^Y) zE524n6i@UneSBoLnM^xoG1^ZXu&e!h#}R+n<3fyVU3V4ngYd|{oFnAYHAQwFI?~B_ z52CBFI5BI*v2RPB4r+QDz`jN>azYw@=sLCjuInUu5$iX7rz3wy??%ei7BDZrzg9lK zwi5!9_Gzw&LHQu_*=78jq}h_feqj5C8yg5)te6eJGocK zwLt}ga|=OVu0MTvQ&054u}xKei2L2nDKoYbGO$Y><;AE)(!Gr-(wpcc=(Tox_NdL6 z-Pn}8=@cXRso}4yKey;m0%F8S^}#pDd_Dw-&;M*Rk_{@4 zb5lhvY_^YmCY-LJC_$a~vfy~%!?O9>M3m$e+sd%9M9si^o45Ki2n?e%2?ze6jU1*= z4el7260`QCG}lOpsb{Vv&%VDjr@;-K#xgt&LtT?h!}Ud>;fS(cYuC$F)iEEmb)@{2 zl3&xE{ot55xd~vX)I5N5ofY{pxVUmXP~rsXdW4Z?#e0dc*d%)!WBiZ-VPAUfVIbB; zrWq0UlYyH-A+|aAI?;}#(+OBlUgtCPEYDyY57d_YoY_xvIazxH<|)Vv=e>!(y0?QUrZ9|uxQtfY>qlHa-r<$EOt#coeSw5-b%59pFA zXI+SL^jm!(!&o)oVo@beV3mJ8N`Swe>_R93rOA5oKl1^R;1R{@&y;Y)=(->=_6Ea& zzQRP1d>ezx4Qc0B8aEuUkb~7;1H)|f-RcXkD&NF@D(shia^H!bFrpV3{UAUJ@rNAqW;@hw9 z^$OkYKOOeW0SgD4Ktu7TV_y8D)$@ry5Mc9*2ZzG;P3$)8t|qCIp6B|{;mIU?2r$&E zITZ>VC?#`jLVJ;K+GG6YLg@zsN;?84Zk^O01CsvX_bLx$4?Pq%$H;c$!PWP6q8BFYaU=Fy>bBkc2O}vh4;MieM_5xP z=IDaFg%LuYB}D@|GHTkBCm2~cRsBOH4r)hsqV1|`?-8|>GpV&{t=F5(<50R6i2Z3+ zYPnhC7u*HCBQ2JAA~k_TeR>bsCrUeruHWkjXB9d7wE8#h)m(a=uQGBsI_cW@$tWGa zxfh50a6_g)yeqwm&hGV&1^;joE2?r+=O!OzuQOg=8 zvt>ooe|z%$cH`$6$_Ph2jXwvLi%za@oINS~p2<}Y>gpIsQXp-HC8aCU1T)cIGqODzz3sVElbdC|IN5=V_XEAM0}(v|sPxj+Aa zD{cFgJZhOmoRONP<~q#_<-A`DSCN*0kRcC(hy-b}*0KP(FOtU`M64GIGK>|QSoCWl z-~*68R*-26qdTy`j6`GnwByiwG&9olbvRr+7QbvDGfFQY;R>&u0^PktsVF_6{#oN# zGe23zp=4FaubVtQEsP=rqe#<>`@Q()DR^u8*gJnK-C>6P@`Z6M(q zxSIR(OiA;j{+Ef;R@^^rWw1L738Rc!rfloaD2G)7XGl}e23U$TNVYCwM4znWKy8S( zgv+{}|L^-MkGlKOQHdYxt)0E8E9?rZ@R4EB9QDT8IKw%qFw&GGql!3US10+`&U8}2 ze`Nx}$V{LK6B?clz87?~!M%TBEx{MCF(GmENt+*>C{#2UKfd2MQDlG7|DO3Ahl9cL zA3v1dIUfOD_9U9a+On))_GLat{rSJzms4+-XcOeM3uGUA4B+R71$akB8~rN_eu2h& z`+vtW{0eII@JfGH;vH><@z=}KDbBfj8q?Gds;4f1SPj@^Kylr%mK2Yy#xX~W^)*_- zM+anrICH)A2TRSdhM-5+`KYCC9K4^ngu;;qPN@*_d$>B<4D)dhI`Tt`Tr|5;m66{$z&;Mjuq5FEPpz>Eir{?MXWmqU?kdt-u=&@o)xb+LJItn8lc?zhp*tZy3<2- zfK-+9&thGAl1>41M-2dHf>l%Wna^Lt+$)WxCzAte+%l5-!9T;tJYa9h`+@y zw5D7g4kap#c!E8jw~U27Xa_CV8CKxj(2aSTrKEdJ@@W}kZ4wD zzf9H)IQwoK0&J2nW+F8K1(O!h`yDLn^xCggi zTEudTHdOGB@)O#%Se|`P-DUUCYbLUp`I{e8AA1SeB-}emr=l8i{dT_$MJDsoUcW0E zqHlzx1OG~UN;*1uKy`yq4+iZDZ8GZQ={)V)>9~+MFIuU*wq~wX9FV%_B0Tg5=9N5V zqa-_oN^f*7ex!0veaQ$}+FzzzsDtQ+sd#Cjwqc|YS zE4X;^A3O#tzP|%LffA%WR=+HGCk3NywaurL9Dx=|6UEP(47H<-@?~Lpt)?#W!#&%vc8aTlb#p0I z+|4N*KWoG(p>A6dKbx(P*9wen8b6z6iYLx2u-mMV{Y}UkZ_D!fkg~yYWdgDKxw_$& zGxulwxxbBSNs<9hj5!9}5@2;F@wEVe`d@RQK~h&!L!h&e$~p>n-bbvI9oFT+H_=cF+bU1Ul0eJyd_)c}Oj6ht11pklgOx0`&0K0Uqo8mJ zP&&B*-;mEWv*3b>afQ~*I*#&MZN78Yjt$!3ug$OMbtq3D`KYGKjLJ_77j5Sq>X)Uj z!oUhn1!@I&Po;a7bmmp|t3@>zcHI_BpkMg}^^MP~=gs&I0rroA(3bi?mGY$yCnXNLi{_{B_JDQ`1i2>w$|Ui_4k|jcYydm7fzj#pNmfSWsd7|y>2?Q lfFC0)_}kZ$}X!#DGW(5E7MMqadIlM0zLE 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�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 WLH%;aLxS-=xmUKM6Y_Ed-9&BhLCe{7?!$K9` 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 literal 0 HcmV?d00001 diff --git a/docs/mesh/sample.rst b/docs/mesh/sample.rst new file mode 100644 index 000000000..79a67ce41 --- /dev/null +++ b/docs/mesh/sample.rst @@ -0,0 +1,30 @@ +Sample application +------------------ + +**blemesh** sample application implements Bluetooth Mesh node that supports On/Off and Level models. + +To build application use following target. Note that since this application uses Non-resolvable Private Address there is +no need for configuring public address. + +:: + + newt target create blemesh + newt target set blemesh app=@apache-mynewt-core/apps/blemesh + newt target set blemesh bsp=@apache-mynewt-core/hw/bsp/nrf52840pdk + newt target set blemesh build_profile=optimized + newt target set blemesh syscfg=BLE_MESH_PB_GATT=1:BLE_MESH_DEV_UUID='(uint8_t[16]){0x22, 0x20, 0}' + +Every device should have unique Device UUID so config amend and rebuild is needed for each of the devices that will be +added to a network. + +:: + + newt target set blemesh syscfg=BLE_MESH_PB_GATT=1:BLE_MESH_DEV_UUID='(uint8_t[16]){0x22, 0x21, 0}' + ... + newt target set blemesh syscfg=BLE_MESH_PB_GATT=1:BLE_MESH_DEV_UUID='(uint8_t[16]){0x22, 0x22, 0}' + ... + newt target set blemesh syscfg=BLE_MESH_PB_GATT=1:BLE_MESH_DEV_UUID='(uint8_t[16]){0x22, 0x23, 0}' + +GATT bearer is enabled so that it is possible to provision those with Bluetooth Mesh application from Silicon Labs +(available `here `__) which doesn't +support advertising bearer.